CRUD com Prepared Statements usando PDO
- Nível
- iniciante
- Tempo Estimado
- 75min
Neste tutorial você vai aprender a Create(Criar), Read(Ler), Update(Atualizar) e Delete(Deletar) informações do banco de dados usando a classe PDO e a técnica de prepared statements. A classe PDO é muito mais rápida e segura que que a extensão mysql_, por isso a preferência pelo seu uso. A técnica de prepared statements é uma forma mais segura de se manipular o banco de dados, pois impede toda e qualquer forma de SQL Injection. Confira nos vídeos abaixo como você pode se atualizar e escrever um script muito melhor.
David CHC • 11/02/2010
Muito boa essa sequência sobre PDO, assistir ontem no VIMEO, a de conexão hoje, rs. PDO é uma ótima alternativa, e indicada, para abstração de banco de dados, e ao contrário que algumas pessoas pensam, é diferente de abstração SQL.
abrs.
Abraão Levi • 15/02/2010
Gostei muito das vídeo aulas! já tinha lido artigos que falavam sobre, mas nunca tinha utilizado. Abraços.
Felipe Freitas • 16/02/2010
Eu gostaria de saber se eu poderia colocar no read no lugar de lazy, fetch colocar row para ter o numero de linhas como se adquire pelo comando mysql_fetch_row?
ta muito boa a video aula parabens
Tutorial City • 17/02/2010
@Felipe Freitas
Existe um método específico para saber o número de linhas retornadas, mas para que ele funcione corretamente você tem que habilitar o armazenamento da consulta em memória. Por motivo de performance algumas versões do PHP desabilitam essa opção, fazendo que esse método sempre retorne zero resultados. Você pode habilitar e desabilitar este armazenamento em qualquer parte do script, mas particularmente eu recomendo que você faça isso somente quando realmente for necessário (caso você sempre vá usar, é melhor habilitar uma só vez assim que você estabelece a conexão).
Para verificar se está habilitado ou não, use o seguinte método: $bd->getAttibute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY), se retornar o valor 1 então o armazenamento em memória está habilitado, e você pode usar pegar o número de lnhas sem problemas, caso retorne 0, significa que está desabilitado e você tem que habilitar. para habilitar faça o seguinte: Logo após o estabelecimento da conexão digite isso: $bd->setAttibute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,1); . Para desabilitar basta trocar o 1 por 0. Para saber o número de linhas retornadas use o método $query->rowCount(); logo após a consulta.
Dê uma olhada nesse snippet, vai ficar mais fácil de entender http://pastebin.com/f233d8ef6
vinicius • 19/02/2010
muito bom, Eduardo! pena que php é demais pra mim (ainda)rs.
assisti a todas as demais vídeo-aulas e gostei bastante.
p.s. você poderia indicar algum site em português que explique o be-a-bá do php (tipo para crianças, rs)?
abraço
Felipe Freitas • 20/02/2010
Uhh vlw consegui aki, a paginação faz normal como no mysql_comand ou tem um jeito mais facil com o pdo?
Tutorial City • 21/02/2010
@Felipe Freitas
Não entendi muito bem que tipo de paginação você quer, mas se for aquela que você separa o conteúdo em várias páginas pra não mostrar tudo na primeira, então você só precisa do total de dados que o banco de dados tem e do número de resultados que você quer mostrar por página, daí você manipula esses dados pra fazer a paginação, não tem muito a ver com PDO em si. Se não for isso você pode explicar de novo?
Abraços
Emmerson Siqueira • 23/02/2010
Caro Eduardo…
To vindo da meu feedback para este conteúdo bastante interessante…
(Ta na hora de deixar de criar classes comuns para conexão com banco de dados e começar a associar extensões como a PDO para a conexão dos mesmos)
Tutorial City • 23/02/2010
@Emmerson Siqueira
PDO é tão simples e tão mais seguro e tão mais leve que a extensão mysql_ que não vejo motivos para não usa-lo.
WilliamF • 26/02/2010
olá vi todos os seus videos estou fazendo um website de jogo em mssql+php+pdo
ta funcionando direitinho até pq tem um amigo q manja algumas coisas de PDO!^^
fiz sistema de login e talz + no cadastro da 1 erro me estranho
na query de verificação de login tipo eu fiz ele consultar no banco para verificar se o login digtado jah existia ou n e uma de e-mail + na hora de executar ele mostra o seguinte erro:
Fatal error: Call to a member function prepare() on a non-object in C:\AppServ\www\pdo\cadastro.php on line 185
o Script q eu desenvolvi é o seguinte:
prepare($vLogin);
$query4->bindParam(“:login”, $login, PDO::PARAM_STR);
$query4->execute();
$checkLogin = $query4->fetchAll(PDO::FETCH_ASSOC);
$vEmail = ‘ SELECT * FROM MEMB_INFO WHERE MAIL_ADDR = :email ‘;
$query5 = $db->prepare($vEmail);
$query5->bindParam( “:email”, $email, PDO::PARAM_STR);
$query5->execute();
$checkEmail = $query5->fetchAll(PDO::FETCH_ASSOC);
if(empty($login) || empty($senha) || empty($resenha) || empty($numero) || empty($pergunta) || empty($resposta) || empty($nome) || empty($snome) || empty($email) || empty($phone) || empty($pais) || empty($idade)){
echo ‘X Erro: Campos foram deixados em Branco’;
}
elseif($checkLogin['memb_id'] > 0 ){
echo ‘X Erro: Login ['.$login.'] ja exíste’;
}
elseif($checkEmail['mail_addr'] > 0 ){
echo ‘X Erro: Login ['.$login.'] ja exíste’;
}
?>
claro ainda n está completo pois n consegui arrumar o erro citado acima do script!^^
se puderes me dar 1 luz ficaria grato desde já
Att.WilliamF
WilliamF • 26/02/2010
Desculpe o script acima citado por min n ei o pq ele colou incompleto o script completo é o seguinte:
if(isset($_POST['submit'])){
/* Dados da conta todos obrigatórios */
$login = $_POST['login'];
$senha = $_POST['senha'];
$resenha = $_POST['resenha'];
$numero = $_POST['numero'];
$pergunta = $_POST['pergunta'];
$resposta = $_POST['resposta'];
/* Dados Pessoais nen todos são obrigatórios */
$nome = $_POST['login'];
$snome = $_POST['senha'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$pais = $_POST['pais'];
$idade = $_POST['idade'];
$vLogin = ‘ SELECT * FROM MEMB_INFO WHERE MEMB_ID = :login ‘;
$query4 = $db->prepare($vLogin);
$query4->bindParam(“:login”, $login, PDO::PARAM_STR);
$query4->execute();
$checkLogin = $query4->fetchAll(PDO::FETCH_ASSOC);
$vEmail = ‘ SELECT * FROM MEMB_INFO WHERE MAIL_ADDR = :email ‘;
$query5 = $db->prepare($vEmail);
$query5->bindParam( “:email”, $email, PDO::PARAM_STR);
$query5->execute();
$checkEmail = $query5->fetchAll(PDO::FETCH_ASSOC);
Tutorial City • 27/02/2010
@WilliamF
Me parece que a variável $db não está recebendo a conexão com o banco de dados. Esse erro está dizendo que você está tentando executar um método de algo que não é um objeto(se tivesse assinalado à conexão, seria um objeto). Verifica se você está incluindo a conexão direitinho(NÃO COLOQUE OS DETALHES DA SUA CONEXÃO NESSE POST, OUTRAS PESSOAS PODEM SE APROVEITAR DISSO!) e se a variável que está assinalando realmente é $db.
Qualquer coisa pode retornar.
Abraços
Dica: Você está executando duas consultas ao banco de dados quando poderia estar executando somente uma. Aparentemente você quer verificar se existe algum registro no banco de dados com o email OU login que está sendo passado. você pode fazer da seguinte maneira: SELECT * FROM MEMB_INFO WHERE MAIL_ADDR = :email OR MEMB_ID = :login, aí se retornar alguma coisa você já sabe que esses dados já existem e pode sugerir que a pessoa escolha outros valores.
Tutorial City • 28/02/2010
@vinicius
Infelizmente não conheço nenhum site que tenha BONS vídeos de PHP básico em português.
Neto • 09/03/2010
Cara muito show essas video aulas de PDO, queria saber (se possível), se
no ‘read.php’ ao invés de ter que digitar o nome no ‘busca’, se a página poderia exibir logo todos os dados(id,nome,email,criado_em) e ao clicar no ID(como link) a página fosse direcionada para a ‘update.php’ levando os dados(nome,email,criado_em), somente do id que foi clicado(selecionado).
Se puder disponibilizar o codigo… Agradeço!
Vlw…
Tutorial City • 10/03/2010
@Neto
1º – Fico feliz que gostou dos tutoriais!;)
2º – Poderia exibir sem problemas. Você só teria que pegar todos os dados de todos os usuário, e na hora de jogar a id na tela você criaria um link com uma querystring(exemplo: ‘atualizar.php?id=2′) para poder acessar o id do usuário e pegar seus dados. Na página de atualização, que você criou, bastaria usar os mesmos conceitos que usei na parte de update da série(terceiro vídeo) pra atualizar o usuário.
Se restou alguma dúvida, por favor deixe-me saber.
Abraços!
Carlos • 25/04/2010
Ola Parabens pela video aulas com certeza,muito interessante usar PDO.
Estou acompanhando as videos para aprender também um pouco sobre a mesma.
Porém quando criei pagina CREATE ao enviar os dados para cadastro tenho o seguinte erro .”SQLSTATE[HY093]: Invalid parameter number: parameter was not defined”.
segue meu a nivel de estudo:
include_once(‘conn.php’);
if(isset($_POST['enviar'])){
$nome = $_POST['nome'];
$email = $_POST['email'];
$sql = ‘ INSERT INTO usuario (id_user,nome_user,email_user) ‘;
$sql.= ‘ VALUES(NULL ,:nome,:email) ‘;
try {
$qr = $con->prepare($sql);
$qr->bindValue(‘:name’,$nome,PDO::PARAM_STR);
$qr->bindValue(‘:email’,$email,PDO::PARAM_STR);
$qr->execute();
}catch(PDOException $e){
echo $e->getMessage();
}
}
Valeu !!!
Tutorial City • 25/04/2010
@Carlos
Esse erro acontece quando você passa um parâmetro que não existe na SQL. Repara que em bindValue você escreve :name, e não :nome como está na SQL.
Vlw pela força!
carlos • 26/04/2010
Valeu Eduardo !!!!
Muito as video aulas !!!
Problema resolvido !!
tarsis • 12/05/2010
Parabéns pelos videos, ficou bem explicado e de uma forma simples.
Bem tenho uma dúvida, como seria o bind se eu precisar formar querys no estilo
$mysqli -> prepare(“SELECT priv FROM testUsers WHERE empresa=? AND username=?
AND password=?”));
Aqui tenho um script q gera as querys, mas coloca as variaveis em vez das interrogações e gostaria de adaptá-la.
Tutorial City • 13/05/2010
@tarsis
Quando você quer usar o ponto de interrogação é necessário que diga o indice dele, por exemplo:
————
$stmt = $db->prepare(“SELECT email FROM usuarios WHERE nome = ? AND idade = ?”);
$stmt->bindValue(1,’eduardo’,PDO::PARAM_STR);
$stmt->bindValue(2,23,PDO::PARAM_INT);
$stmt->execute();
————
Repare como o primeiro parâmetro do método bindValue é o índice do ponto de interrogação, o segundo parâmetro é o valor que está passando, e o terceiro parâmetro é o tipo de variável que está usando. O terceiro parâmetro não é obrigatório mas é recomendável.
Jesse • 31/05/2010
Boa Cara.. valew pelas video aulas… ja tinha lido sobre PDO, mas nada melhor do que uma video aula pra esclarecer as ideias.. muito simples de usar.. achava que fosse mais complexto…
abraço !!!
Kaitlyn • 23/06/2010
Ola Parabens pela video aulas com certeza,muito interessante usar PDO.
Estou acompanhando as videos para aprender também um pouco sobre a mesma.
Porém quando criei pagina CREATE ao enviar os dados para cadastro tenho o seguinte erro .”SQLSTATE[HY093]: Invalid parameter number: parameter was not defined”.
segue meu a nivel de estudo:
include_once(‘conn.php’);
if(isset($_POST['enviar'])){
$nome = $_POST['nome'];
$email = $_POST['email'];
$sql = ‘ INSERT INTO usuario (id_user,nome_user,email_user) ‘;
$sql.= ‘ VALUES(NULL ,:nome,:email) ‘;
try {
$qr = $con->prepare($sql);
$qr->bindValue(‘:name’,$nome,PDO::PARAM_STR);
$qr->bindValue(‘:email’,$email,PDO::PARAM_STR);
$qr->execute();
}catch(PDOException $e){
echo $e->getMessage();
}
}
Valeu !!!