CRUD com Prepared Statements usando PDO

, , • 11/02/2010

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.

Estabelecendo uma conexão

Inserindo Dados

Atualizando Dados

Deletando Dados

Lendo Dados

Códigos digitados nos vídeos

Comentários

  1. David CHC11/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.

    Responder

  2. Abraão Levi15/02/2010

    Gostei muito das vídeo aulas! já tinha lido artigos que falavam sobre, mas nunca tinha utilizado. Abraços.

    Responder

  3. Felipe Freitas16/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

    Responder

  4. Tutorial City17/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

    Responder

  5. vinicius19/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

    Responder

  6. Felipe Freitas20/02/2010

    Uhh vlw consegui aki, a paginação faz normal como no mysql_comand ou tem um jeito mais facil com o pdo?

    Responder

  7. Tutorial City21/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

    Responder

  8. Emmerson Siqueira23/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)

    Responder

  9. Tutorial City23/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.

    Responder

  10. WilliamF26/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

    Responder

  11. WilliamF26/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);

    Responder

  12. Tutorial City27/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.

    Responder

  13. Tutorial City28/02/2010

    @vinicius
    Infelizmente não conheço nenhum site que tenha BONS vídeos de PHP básico em português.

    Responder

  14. Neto09/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…

    Responder

  15. Tutorial City10/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!

    Responder

  16. Carlos25/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 !!!

    Responder

  17. Tutorial City25/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!

    Responder

  18. carlos26/04/2010

    Valeu Eduardo !!!!
    Muito as video aulas !!!
    Problema resolvido !!

    Responder

  19. tarsis12/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.

    Responder

  20. Tutorial City13/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.

    Responder

  21. Jesse31/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 !!!

    Responder

  22. Kaitlyn23/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 !!!

    Responder

Envie Seu Comentário