quarta-feira, 17 de novembro de 2010

PHP PDO

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.



Um comentário:

  1. Parabéns! Excelente Post!
    Incentivar o uso do PDO é contribuir para a confecção de aplicações mais moderanas, mais rápidas e menos bugadas.

    Value demais!

    ResponderExcluir