Dando continuidade sobre o assunto PDO (PHP Data Objects), hoje estarei falando exclusivamente sobre como efetuar consultas SQL (select) utilizando esta biblioteca, no post anterior sobre PDO ensinei como habilitar esta biblioteca, as possíveis conexões com os SGDBs e uma breve introdução de como efetuar uma consulta ao banco de dados.

Para todos os exemplos a variável $pdo será a instancia do objeto PDO contendo as informações de conexão com o banco de dados.

Exemplo de conexão:

<?php
// Instancia o objeto PDO
$pdo = new PDO('mysql:host=localhost;dbname=exemplo_select', 'root', '');
// define para que o PDO lance exceções caso ocorra erros
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

A forma mais simples de ser executada uma consulta seria utilizando query conforme o exemplo:

<?php
// executa a instrução SQL
$consulta = $pdo->query("SELECT nome, usuario FROM login;");
?>

Para obter os dados pode ser utilizado um while percorrendo assim cada linha retornada do banco de dados:

<?php
while ($linha = $consulta->fetch(PDO::FETCH_ASSOC)) {
    // aqui eu mostro os valores de minha consulta
    echo "Nome: {$linha['nome']} - Usuário: {$linha['usuario']}<br />";
}
?>

Tendo como resultado as seguintes linhas:

Nome: Marcos - Usuário: marcos
Nome: Pedro - Usuário: pedro
Nome: João - Usuário: joao

Caso deseje pegar somente a primeira linha de sua consulta pode ser utilizado o fatch():

<?php
$linha = $consulta->fetch(PDO::FETCH_ASSOC);
print_r($linha);
?>
Array([nome] => Marcos [usuario] => marcos)

Existe também a possibilidade de retornar todas as linhas da consulta utilizando o fatchAll():

<?php
$linha = $consulta->fetchAll(PDO::FETCH_ASSOC);
print_r($linha);
?>
Array(
    [0] => Array([nome] => Marcos [usuario] => marcos)
    [1] => Array([nome] => Pedro [usuario] => pedro)
    [2] => Array([nome] => João [usuario] => joao)
)

Vamos fazer agora alguns filtros em nossa consulta SQL, para isso deixaremos de utilizar a “query” e passamos a utilizar o “prepare”, a “query” é muito útil para consultas que não recebam parâmetros, principalmente os passados através de $_POST ou $_GET, pois a mesma não faz tratamento contra SQL Injection, já com o “prepare” passamos a não termos mais esta dor de cabeça.

Utilizando parâmetro nomeado:

<?php
$consulta = $pdo->prepare("SELECT nome, senha FROM login where usuario = :usuario;");
$consulta->bindParam(':usuario', $_GET['usuario'], PDO::PARAM_STR);
$consulta->execute();
$linha = $consulta->fetch(PDO::FETCH_ASSOC);
?>

Lembrando, caso utilize o “bindParam” sempre deve ser passado uma variável no segundo parâmetro, caso contrario terá uma mensagem de erro muito parecido com esta “Fatal error: Cannot pass parameter 2 by reference in”.

Caso deseje passar algum diretamente sem a necessidade de criar uma variável utilize “bindValue”, no exemplo abaixo estarei mostrando a possibilidade de passar um parâmetro inteiro juntamente com o “bindValue”.

<?php
$consulta = $pdo->prepare("SELECT nome, senha FROM login where id_login = :id;");
$consulta->bindValue(':id', 1, PDO::PARAM_INT);
$consulta->execute();
$linha = $consulta->fetch(PDO::FETCH_ASSOC);
?>

Lembrando também, que ao utilizar o “bindParam” ou “bindValue” a PDO não se comunica com o banco de dados para saber qual o tipo de dado deve ser utilizado no terceiro parâmetro, por padrão sempre será utilizado o “PDO::PARAM_STR” caso não tenha sido informado.

O quarto parâmetro é a quantidade de caracteres a serem utilizados, caso o texto informado seja maior que o permitido informado, será enviado para o banco somente parte ou a quantidade permitida, evitando assim, um possível erro no banco de dados. Este parâmetro utilizo mais ao fazer um insert ou update, em select pouco vezes, para não dizer nunca.

Alem dos parâmetros nomeado podemos passar os dados através de parâmetros numéricos substituindo os “?” da consulta SQL, que são os pontos chave.

<?php
$consulta = $pdo->prepare("SELECT nome, senha FROM login where usuario = ?;");
$consulta->bindParam(1, $_GET['usuario'], PDO::PARAM_STR);
$consulta->execute();
$linha = $consulta->fetch(PDO::FETCH_ASSOC);
?>

Podemos passar todos os valores através de um array seja com parâmetros nomeados ou numéricos.

<?php
$dados = array('pedro', 'João');
$consulta = $pdo->prepare("SELECT nome, senha FROM login where usuario = ? or nome = ?;");
$consulta->execute($dados);
$linha = $consulta->fetchAll(PDO::FETCH_ASSOC);

// ou

$dados = array(':usuario' => 'pedro', ':nome' => 'João');
$consulta = $pdo->prepare("SELECT nome, senha FROM login where usuario = :usuario or nome = :nome;");
$consulta->execute($dados);
$linha = $consulta->fetchAll(PDO::FETCH_ASSOC);
?>

Outra grande vantagem de utilizar o prepare é a possibilidade de definirmos a consulta SQL e poder utilizá-la quantas vezes for necessária tendo a possibilidade de mudar seus parâmetros.

<?php
$consulta = $pdo->prepare("SELECT nome, senha FROM login where usuario = ?;");

// primeira consulta
$consulta->execute(array('pedro'));
$linha = $consulta->fetch(PDO::FETCH_ASSOC);

// segunda consulta
$consulta->execute(array('joao'));
$linha = $consulta->fetch(PDO::FETCH_ASSOC);
?>

Acredito que seja isso na questão de select utilizando a PDO, fico a disposição caso reste alguma duvida.

Até breve.
Abraço.

23 Responses to “Consultas SQL utilizando PDO (PHP Data Objects)”

  1. Junior Eberhardt says:

    ótimo tutorial, aprendi muito…

    e o bloco try catch, quando deve/se devo usar?

    • ctncardoso says:

      Buenas Jr.

      Bem lembrado, acabei não comentando nada sobre os blocos try catch.

      Por padrão utilizo em todas as consultas SQL, sem exceção.

      Sempre é bom efetuar um tratamento de erros, evitando assim aquelas mensagens inconvenientes no meio do sistema.

      Só um detalhe que deve ser observado é que deve definir a linha setAttribute para utilizar as exceptions PDOException.

      <?php
      try{

          // Conexao com banco MySql
          $conn = new PDO("mysql:host={$host}; port={$port}; dbname={$name}", $user, $pass);
          // define para que o PDO lance exceções na ocorrência de erros
          $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         
          // executa a instrução SQL
          $consulta = $pdo->query("SELECT nome, usuario FROM login;");
         
      }catch(PDOException $e){
          // Caso ocorra uma exceção, exibe na tela
          echo $e->getMessage();
      }
      ?>

      Após isso só utilizar os blocos try catch tranquilamente.

      Forte Abraço.

  2. Alison Silva says:

    Muito bom seu tutorial. Principalmente pela questão do SQL Injection, que é uma grande pedra no sapato dos programadores.
    Sem falar na facilidade que PDO proporciona, acelerando bastante o processo de desenvolvimento.

  3. Tem coisa mais fácil do que realizar consultas SQL dentro dos trâmites corretos da programação com PDO. Reiterando a frase anterior e enfatizo a ajuda desse tutorial show de bola. Quero desejar meus parabéns Cardoso por essa\ excelente explicação.

  4. Maxwell says:

    Muito boa explicação, a classe PDO com certeza será muito útil nas minhas necessidades.

  5. Excelente tutorial… muito obrigado por compartilhar

Leave a Reply

*

Current month ye@r day *