jnejunior 1 Denunciar post Postado Março 8, 2011 salve rapaziada... estou com uma dúvida... como mostrar os dados de um tabela usando PDO? só exibir mesmo sem filtro nem pesquisa nem nada... tenho este script, mas ele faz busca pelo nome% <?php date_default_timezone_set('America/Sao_Paulo'); include_once('config.php'); if (isset($_POST['buscar'])) { $nome = $_POST['nome']; $busca = $nome . '%'; $sql = 'SELECT * FROM usuario WHERE nome LIKE :nome'; try { $query = $bd->prepare($sql); $query->execute(Array(':nome' => $busca)); $res = $query->fetchAll(PDO::FETCH_NUM); } catch (PDOException $e) { echo $e->getMessage(); } foreach ($res as $resp) { $id = $resp[0]; $nome = $resp[1]; $email = $resp[2]; $criado = substr($resp[3], 8, 2) . '-' . substr($resp[3], 5, 2) . '-' . substr($resp[3], 0, 4) . '' . substr($resp[3], 10); echo '<ul> <li><strong>ID: ', $id, '</strong></li> <li><strong>Nome: ', $nome, '</strong></li> <li><strong>Email: ', $email, '</strong></li> <li><strong>Criado em: ', $criado, '</strong></li> </ul>'; } exit(); } ?> Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 $res é definido dentro do bloco try, se uma exceção for disparada, $res não existirá. Veja também o método PDOStatement::bindParam() Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Março 8, 2011 estou começando em PDO, pois descobri que é muito seguro, mas este script funcionou perfeitamente... tirei isso da video aula do http://tutorial-city.net/... Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 ...mas este script funcionou perfeitamente... Se funcionou "perfeitamente", onde está a dúvida ? Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Março 8, 2011 você leu o tópico? salve rapaziada... estou com uma dúvida... como mostrar os dados de um tabela usando PDO? só exibir mesmo sem filtro nem pesquisa nem nada... tenho este script, mas ele faz busca pelo nome% ... o propósito da minha dúvida é: preciso fazer uma consulta para saber se o usuário já existe no banco... mo mysql é moleza, mas em PDO estou tendo dúvidas... então só preciso saber como trabalhar a parte da consulta mesmo... como fazer isso de outra forma? $selecao = $bd->query('SELECT * FROM usuario')->fetchAll(); Compartilhar este post Link para o post Compartilhar em outros sites
Leozitho 81 Denunciar post Postado Março 8, 2011 Tudo o que você precisa saber sobre PDO você encontra no manual, inclusive exemplos de utilização. ;) http://br.php.net/manual/pt_BR/book.pdo.php Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 você leu o tópico? Amigo, Eu li seu tópico, tanto que respondi assim: $res é definido dentro do bloco try, se uma exceção for disparada, $res não existirá. Veja também o método PDOStatement::bindParam() Agora, quando você volta a responder que está "funcionando perfeitamente" significa que: 1. Você não precisa de ajuda. 2. Você ignorou a ajuda que lhe foi dada. Argumentar que "tirou "aquilo" de uma vídeo aula", amigo, existe muita desinformação por ai, se você encontrou aquele fragmento em uma vídeo aula, você deve apagar o link de seus bookmarks. Escrever aquele fragmento, utilizando um bloco try{} catch() daquela forma é um crime que não deve ser cometido. Volto a tentar lhe ajudar, passando novamente o mesmo link: Veja :seta: PDOStatement::bindParam() E dessa vez, por favor, siga o link antes de postar novamente, lhe garanto que tudo o que você precisa está ai. ;) Compartilhar este post Link para o post Compartilhar em outros sites
criatividade zero 17 Denunciar post Postado Março 8, 2011 $res é definido dentro do bloco try, se uma exceção for disparada, $res não existirá. Veja também o método PDOStatement::bindParam() quando usa try, se der erro o bloco posterior nao é executado confere? Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Março 8, 2011 pergunto a você: você entrou no link que passei? assistiu a video aula? perguntou pro autor 'Eduardo de Matos' porque ele fez dessa maneira? outra, o MXMASTERS não colocaria um 'serie' de video aulas desse autor caso não tivesse assistido e concluído que eram boas video aulas, não acha? você não pode simplesmente sair por ai ofendendo o trabalho dos outros, dizendo que não esta correto, eu concordo que nem tudo que funciona esta correto, mas vamos ser mais compreensivos... eu postei minha dúvida, agora consegui fazer de um jeito diferente, você pode pelo menos responder se esta certo ou errado, e se pode melhorar? <?php // inclui arquivo de configuração com banco de dados require ("config.php"); // cria sql usanto heredoc $sql = <<<SQL SELECT * FROM usuario SQL; $exec = $bd->query($sql)->fetchAll(); // conta quantos registros existem na tabela $contar = count($exec); // mostra na tela o resultado echo 'existem ', $contar, ' registros na tabela usuários.'; ?> Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 você não pode simplesmente sair por ai ofendendo o trabalho dos outros, dizendo que não esta correto, eu concordo que nem tudo que funciona esta correto, mas vamos ser mais compreensivos... heheheh, Não sou, e jamais serei, conivente com desinformação, seja quem for que tiver publicado o conteúdo. Então, se na vídeo aula, o autor estiver mostrando como correto, aquele fragmento que você postou, então eu posso sim, com convicção, dizer que é um crime. Quanto a sua dúvida, e aproveitando para responder ao amigo criatividadezero: Um exemplo completo: <?php $nome = 'algumacoi%'; //$_POST[ 'nome' ]; try { $pdo = new PDO( 'mysql:host=servidor;dbname=banco_de_dados' , 'usuario' , 'senha' ); $pdo->setAttribute( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ); $stm = $pdo->prepare( 'SELECT * FROM `usuario` WHERE `nome` LIKE :nome;' ); $stm->bindParam( ':nome' , $nome , PDO::PARAM_STR ); if ( $stm->execute() ) { foreach ( $stm->fetchAll( PDO::FETCH_OBJ ) as $usuario ) { echo 'id: ' , $usuario->id , PHP_EOL; echo 'Nome: ' , $usuario->nome , PHP_EOL; //... } } } catch ( PDOException $e ) { var_dump( $e->getMessage() ); echo 'Esse "echo" só é disparado caso uma exceção tenha sido disparada.' , PHP_EOL; } echo 'Esse "echo" sempre vai ser executado, independentemente de uma exceção ter sido disparada ou não.' , PHP_EOL; Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Março 8, 2011 mas você não respondeu minha pergunta quanto meu ultimo código Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 mas você não respondeu minha pergunta quanto meu ultimo código Não é possível afirmar, com convicção, se está totalmente correto, ou não. Quando você colocou o código dentro de "config.php" e não disse o que está usando, fica um tanto complicado, veja só: <?php // inclui arquivo de configuração com banco de dados require ("config.php"); Nesse instante, você pode estar utilizando mysqli ou PDO ou qualquer outra coisa. // cria sql usanto heredoc $sql = <<<SQL SELECT * FROM usuario SQL; Nesse caso, heredoc é desnecessário, se você tiver uma estrutura com uma indentação muito grande, você prejudicará a leitura do código ao ter que colocar o SQL; na primeira coluna. Isso seria interessante apenas se sua string fosse muito grande e, ainda assim, seria totalmente dispensável. $exec = $bd->query($sql)->fetchAll(); // conta quantos registros existem na tabela $contar = count($exec); Nesse momento, existe um erro grave. Você está assumindo que tudo ocorreu exatamente como previsto e, fazer isso, é um crime. Imagine que seu banco caia, ou que alguma coisa ocorra na execução da consulta ou ainda pior, apesar de você não ter utilizado nenhum parâmetro nesse instante, é bem possível que você vá jogar algum dado enviado pelo usuário diretamente na string e, ai, você terá um problema sério de segurança. EDIT: Não deixe de utilizar try{} catch(), apenas veja a forma correta de fazê-lo. Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Março 8, 2011 isso aqui, é desnecessário: $sql = <<<SQL SELECT * FROM usuario SQL; poderia ser só uma string simples: $sql = 'SELECT * FROM usuario'; require e include não são funções, portanto não precisam de () require 'config.php'; logo, também prefira usar aspas simples, qndo você não precisar que o conteudo da string seja analisado. com PDO, usa o count() mesmo para saber qntas linhas retornou da query. Compartilhar este post Link para o post Compartilhar em outros sites
criatividade zero 17 Denunciar post Postado Março 8, 2011 jnejunior, calma companheiro, o João so esta tentando ajudar João, me referia ao seguinte a classe cria_erro gera um Exception, e no caso, uma_outra_funcao_qualquer não seria rodada class cria_erro{} gera um [b]throw new Exception('eu fiz um erro.');[/b] try { $pdo = new cria_erro(); /*Exception impede a execução posterior*/ uma_outra_funcao_qualquer() } catch ( PDOException $e ) { var_dump( $e->getMessage() ); } [/php] so para eu entender melhor o que esta no manual :) Quando uma exceção é disparada, código logo após à instrução não será executada, e o PHP tentará achar o primeiro bloco catch correspondente à exceção disparada Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 a classe cria_erro gera um Exception, e no caso, uma_outra_funcao_qualquer não seria rodada Exato, veja: <?php $exceptions = array( new Exception( 'Exceção normal' ), new RuntimeException( 'Exceção de tempo de execução' ), new InvalidArgumentException( 'Exceção de argumento inválido.' ), new UnexpectedValueException( 'Exceção de valor inesperado' ), new PDOException( 'Exceção do PDO' ) ); foreach ( $exceptions as $exception ) { try { printf( "Disparando uma %s\n" , get_class( $exception ) ); throw $exception; echo 'Isso aqui jamais será executado.'; } catch ( PDOException $e ) { var_dump( 'Bloco que só pega exceções PDOException' ); var_dump( $e->getMessage() ); } catch ( UnexpectedValueException $e ) { var_dump( 'Bloco que só pega exceções UnexpectedValueException' ); var_dump( $e->getMessage() ); } catch ( InvalidArgumentException $e ) { var_dump( 'Bloco que só pega exceções InvalidArgumentException' ); var_dump( $e->getMessage() ); } catch ( RuntimeException $e ) { var_dump( 'Bloco que só pega exceções RuntimeException' ); var_dump( $e->getMessage() ); } catch ( Exception $e ) { var_dump( 'Bloco que pega qualquer tipo de exceção, seja Exception ou qualquer uma das listadas acima e que não tiver sido pega ainda.' ); var_dump( $e->getMessage() ); } echo "----[ Isso sempre é executado ]------\n\n"; } Saída: Disparando uma Exception string(126) "Bloco que pega qualquer tipo de exceção, seja Exception ou qualquer uma das listadas acima e que não tiver sido pega ainda." string(16) "Exceção normal" ----[ Isso sempre é executado ]------ Disparando uma RuntimeException string(46) "Bloco que só pega exceções RuntimeException" string(32) "Exceção de tempo de execução" ----[ Isso sempre é executado ]------ Disparando uma InvalidArgumentException string(54) "Bloco que só pega exceções InvalidArgumentException" string(33) "Exceção de argumento inválido." ----[ Isso sempre é executado ]------ Disparando uma UnexpectedValueException string(54) "Bloco que só pega exceções UnexpectedValueException" string(29) "Exceção de valor inesperado" ----[ Isso sempre é executado ]------ Disparando uma PDOException string(42) "Bloco que só pega exceções PDOException" string(16) "Exceção do PDO" ----[ Isso sempre é executado ]------ ;) Compartilhar este post Link para o post Compartilhar em outros sites
criatividade zero 17 Denunciar post Postado Março 8, 2011 Quando uma exceção é disparada, código logo após à instrução não será executada, e o PHP tentará achar o primeiro bloco catch correspondente à exceção disparada quando eu li isso, tinha visto que o bloco fora do try continuava rodando e não tinha entendi do o motivo, depois que fui perceber... acho que li sem interpretar, agora ficou claro e confirmado :D tks []s Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Março 8, 2011 meu arquivo de config.php <?php define('HOST', 'localhost'); define('USUARIO', 'root'); define('SENHA', '231511'); define('BD', 'trabalhando_pdo'); $dsn = 'mysql:host=' . HOST . ';dbname=' . BD; try { $bd = new PDO($dsn, USUARIO, SENHA); $bd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo htmlentities('Houve um erro na conexão! ' . $e->getMessage()); } $res é definido dentro do bloco try, se uma exceção for disparada, $res não existirá. o que você indica para ser feito..? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 8, 2011 define('HOST', 'localhost'); define('USUARIO', 'root'); define('SENHA', '231511'); define('BD', 'trabalhando_pdo'); Dentro desse arquivo, isso ai é completamente desnecessário, você está jogando fora, recursos preciosos do servidor. $dsn = 'mysql:host=' . HOST . ';dbname=' . BD; Mesmo caso, você não precisa dessa variável, basta jogar isso ai no construtor do objeto PDO. try { $bd = new PDO($dsn, USUARIO, SENHA); $bd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { Isso ai está legal. echo htmlentities('Houve um erro na conexão! ' . $e->getMessage()); } Não tem sentido utilizar htmlentities ai, você só estará consumindo recursos do seu servidor. $res é definido dentro do bloco try, se uma exceção for disparada, $res não existirá. o que você indica para ser feito..? Eu indiquei a forma correta, com um exemplo completo, no meu post #10. ;) Compartilhar este post Link para o post Compartilhar em outros sites
jnejunior 1 Denunciar post Postado Março 8, 2011 João, desculpa por tudo, mas não sabia em quem acreditar... será que você pode me dizer se agora esta certo? certo mesmo? gosto de aprender as coisas do modo mais correto, e já que você manja né... <?php date_default_timezone_set('America/Sao_Paulo'); require_once 'config.php'; if (isset($_POST['buscar'])) { $nome = $_POST['nome']; $busca = $nome . '%'; try { $bd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query = $bd->prepare('SELECT * FROM usuario WHERE nome LIKE :nome;'); $query->bindParam(':nome', $nome, PDO::PARAM_STR); if ($query->execute(Array(':nome' => $busca))) { $res = $query->fetchAll(PDO::FETCH_NUM); foreach ($res as $resp) { $id = $resp[0]; $nome = $resp[1]; $email = $resp[2]; $criado = date('d-m-y H:i:s', strtotime($resp[3])); echo '<ul> <li><strong>ID: ', $id, '</strong></li> <li><strong>Nome: ', $nome, '</strong></li> <li><strong>Email: ', $email, '</strong></li> <li><strong>Criado em: ', $criado, '</strong></li> </ul>'; } } } catch (PDOException $e) { var_dump($e->getMessage()); echo 'Esse "echo" só é disparado caso uma exceção tenha sido disparada.', PHP_EOL; } } ?> <!doctype html> <html lang="pt-br"> <head> <title>Ler</title> <meta charset="utf-8"> </head> <body> <h1>Buscar</h1> <form action="" method="post"> <div><label for="nome">Nome</label><input type="text" name="nome" /></div> <div><input type="submit" value="Buscar" name="buscar" /></div> </form> </body> </html> Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 9, 2011 será que você pode me dizer se agora esta certo? certo mesmo? gosto de aprender as coisas do modo mais correto Agora está legal, porém você ainda pode melhorar: Veja só, quando você inclui o código que faz a conexão com o banco antes da verificação do "buscar" você abre uma conexão desnecessariamente, gastando recursos preciosos do servidor e atrasando a resposta ao usuário que ainda não fez a busca. O ideal seria você separar as camadas, mas já que você preferiu misturar tudo, apenas não faça a conexão desnecessariamente, leia os comentários no código, existem outros detalhes que podem ser melhorados. <?php // date_default_timezone_set( 'America/Sao_Paulo' ); //coloque isso aqui dentro do seu config.php if ( isset( $_POST[ 'buscar' ] ) && isset( $_POST[ 'nome' ] ) ) { require_once 'config.php'; //Utilize sua conexão apenas quando for necessário //$nome = $_POST[ 'nome' ]; //é desnecessário criar essa variável aqui, só consome recurso desnecessário $busca = $_POST[ 'nome' ] . '%'; try { //$bd->setAttribute( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ); //coloque isso dentro do seu config.php $query = $bd->prepare( 'SELECT * FROM usuario WHERE nome LIKE :nome;' ); $query->bindParam( ':nome' , $nome , PDO::PARAM_STR ); if ( $query->execute() ) { //você não precisa fazer o bind aqui, ele já foi feito utilizando o método PDOStatement::bindParam() $res = $query->fetchAll( PDO::FETCH_NUM ); //evite utilizar FETCH_NUM, prejudica muito a leitura de quem não conhece sua tabela; foreach ( $res as $resp ) { $id = $resp[ 0 ]; //se você tivesse utilizado FETCH_ASSOC ou FETCH_OBJ, seria fácil ler seu código nesse bloco $nome = $resp[ 1 ]; $email = $resp[ 2 ]; $criado = date( 'd-m-y H:i:s' , strtotime( $resp[ 3 ] ) ); echo '<ul> <li><strong>ID: ', $id, '</strong></li> <li><strong>Nome: ', $nome, '</strong></li> <li><strong>Email: ', $email, '</strong></li> <li><strong>Criado em: ', $criado, '</strong></li> </ul>'; } } } catch ( PDOException $e ) { var_dump( $e->getMessage() ); echo 'Esse "echo" só é disparado caso uma exceção tenha sido disparada.', PHP_EOL; } } PS: Cuidado ao utilizar o DOCTYPE do html5, essa versão ainda não é estável e deve ser utilizada com parcimônia Compartilhar este post Link para o post Compartilhar em outros sites