PDO (PHP Data Objects) é um módulo de PHP construído sob o paradigma Orientado a Objetos e cujo objetivo é prover uma padronização da forma com que PHP se comunica com um banco de dados relacional. Este módulo surgiu a partir da versão 5 de PHP. PDO, portanto, é uma interface que define um conjunto de classes e a assinatura dos métodos de comunicação com uma base de dados.
PDO juntou o que havia de melhor em cada driver e gerou uma especificação. Embora a especificação não trabalhe com resource explicitamente, ela define duas classes com significados semelhantes: PDO (que representa uma conexão) e PDOStatement (que representa uma consulta/resultado). Além destas, existe a classe PDOException, que é disparada por alguns métodos para que seja realizado o tratamento de exceções
Para utilizar PDO, primeiro é instanciado um objeto da classe PDO, que representa a conexão com um banco. No construtor da classe, deve ser informado o chamado "DSN", que é uma string de conexão semelhante àquela vista anteriormente na função de conexão com PostgreSQL. Cada driver PDO especifica uma forma de como é criado o DSN para o SGBD correspondente. Além do DSN, também é informado, por parâmetro, o usuário, a senha de acesso e as opções adicionais.
// Exemplo de conexao com MySQL via PDO
$dsn = 'mysql:host=host;port=3306;dbname=bd';
$usuario = 'usuario';
$senha = 'senha';
$opcoes = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_CASE => PDO::CASE_LOWER
);
try {
$pdo = new PDO($dsn, $usuario, $senha, $opcoes);
} catch (PDOException $e) {
echo 'Erro: '.$e->getMessage();
}
Após abrir uma conexão, as consultas podem ser feitas de duas maneiras:
1 - Através da própria conexão, com o método "exec" ou o "query";
2 - Criando uma prepared statement com o método "prepare", que devolve um objeto da classe PDOStatement, e depois executando o método "execute" (desta classe).
O método "query" é utilizado para consultas que retornam resultados tabulares (como o SELECT) e devolve um objeto da classe PDOStatement com o resultado. Já o método "exec" é utilizado para consultas que não retornam resultados tabulares (como o INSERT, UPDATE, DELETE) e retorna apenas o número de linhas afetadas.
Já o método "prepare" é útil para criar uma consulta com dados variáveis. É possível especificar uma SQL com pontos de substituição que, ao serem substituidos, são escapados pela classe automaticamente. Vejamos alguns exemplos:
// Usando "exec"
$inseriu = $pdo->exec('INSERT INTO logs (operacao) VALUES (1)');
$ultimo_id = $pdo->lastInsertId();
// Usando "query"
$stmt = $pdo->query('SELECT nome, login FROM usuarios');
// Percorrento um resultset com while
while ($obj = $stmt->fetchObject()) {
...
}
// Percorrendo um resultset com foreach
foreach ($stmt as $linha) {
...
}
Note que a
classe PDOStatement (objeto $stmt) implementa a interface Traversable, indicando que ela pode ser
percorrida por uma estrutura "foreach".
Existem diferentes formas de se executar uma
prepared statement com PDO:// 1 - Usando "?" nos pontos-chave
$stmt = $pdo->prepare('INSERT INTO usuarios (nome, login) VALUES (?,?)');
// Passando os valores a serem usados no primeiro e segundo "?"
$dados = array('Rubens', 'rubens');
$consultou = $stmt->execute($dados);
// 2 - Usando pontos-chave nomeados
$stmt = $pdo->prepare('INSERT INTO usuarios (nome, login) VALUES (:nome, :login)');
// Passando os valores a serem usados em :nome e :login
array(':nome' => 'Rubens', ':login' => 'rubens');
$consultou = $stmt->execute($dados);
// 3 - Fazendo binding de parametros
$stmt = $pdo->prepare('INSERT INTO usuarios (nome, login) VALUES (:nome, :login)');
// Fazendo o binding
$nome = 'Rubens';
$login = 'rubens';
$stmt->bindParam(':nome', $nome, PDO::PARAM_STR, 128);
$stmt->bindParam(':login', $login, PDO::PARAM_STR, 20);
// Executando a SQL com os valores definidos com binding
$consultou = $stmt->execute();
Prepared statements tendem a ser mais rápidas que as consultas convensionais, já que a
consulta fica previamente "compilada" e pronta para execução com novos valores. Ao invés do SGBD interpretar toda a SQL, ele apenas atribui novos valores aos pontos chave e realiza a operação. Funcionalidade muito útil para inserções ou atualizações em massa em uma tabela.
Conclusão
O uso das novidades da PDO com técnicas de captura e tratamento de exceções, juntando com outra boas práticas de programação e orientação a objetos traz muitas vantagens ao desenvolvimento de aplicações PHP.
Parabéns! Excelente Post!
ResponderExcluirIncentivar o uso do PDO é contribuir para a confecção de aplicações mais moderanas, mais rápidas e menos bugadas.
Value demais!