Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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();
}
?>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/...
>
...mas este script funcionou perfeitamente...
Se funcionou "perfeitamente", onde está a dúvida ?
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();
Tudo o que você precisa saber sobre PDO você encontra no manual, inclusive exemplos de utilização. ;)
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.
;)
>
$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?
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.';
?>>
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;
//...
}
}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;mas você não respondeu minha pergunta quanto meu ultimo código
>
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.
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.
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() );
}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
>
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 ) { printf( "Disparando uma %s\n" , get_class( $exception ) );
throw $exception;
echo 'Isso aqui jamais será executado.'; var_dump( 'Bloco que só pega exceções PDOException' );
var_dump( $e->getMessage() ); var_dump( 'Bloco que só pega exceções UnexpectedValueException' );
var_dump( $e->getMessage() ); var_dump( 'Bloco que só pega exceções InvalidArgumentException' );
var_dump( $e->getMessage() ); var_dump( 'Bloco que só pega exceções RuntimeException' );
var_dump( $e->getMessage() ); 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 ]------
;)
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
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); 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..?
>
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);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.
;)
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>>
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
$res é definido dentro do bloco try, se uma exceção for disparada, $res não existirá.
Veja também o método PDOStatement::bindParam()