Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jnejunior

exibir dados da tabela usando PDO

Recommended Posts

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

$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

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

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

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&aacuterios.';
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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
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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.