+15

Desmistificando o PDO - PHP Data Object

criado por Rubens Takiguti Ribeiro em 16/12/2009 12:38am
Por que usar PDO?

Antes da chegada de PDO, a linguagem PHP oferecia suporte à comunicação com diferentes modelos de SGBD através de módulos específicos. A maioria deles provia uma biblioteca de funções e utilizava um resource para representar a conexão e outro para representar um resultset (o resultado de uma consulta). As operações eram feitas sobre as variáveis de resource.

Cada driver implementava suas operações conforme imaginavam ser mais adequados. Embora alguns deles tivessem um funcionamento semelhante, a ordem dos parâmetros nem sempre era a mesma e podia causar uma certa confusão entre programadores.

Quem já trabalhou com a biblioteca de funções de MySQL ou PostgreSQL, deve conhecer este funcionamento:

// MySQL
$c = mysql_connect('host', 'usuario', 'senha');
mysql_select_db('bd', $c);
mysql_set_charset('UTF8', $c);

$resultado = mysql_query('SELECT nome FROM usuarios', $c);
while ($obj = mysql_fetch_object($resultado)) {
    echo $obj->nome;
}
mysql_free_result($resultado);
mysql_close($c);

// PostgreSQL
$c = pg_connect('host=host port=5432 dbname=bd user=usuario password=senha');
pg_set_client_encoding($c, 'UNICODE');

$resultado = pg_query($c, 'SELECT nome FROM usuarios');
while ($obj = pg_fetch_object($resultado)) {
    echo $obj->nome;
}
pg_free_result($resultado);
pg_close($c);

Note que a forma de conexão é feita através de estratégias diferentes: MySQL passava os dados de conexão através de parâmetros, já o PostgreSQL utilizava uma string de conexão (com vários dados), que é uma alternativa mais extensível. Observe, ainda, que MySQL costuma receber o resource de conexão como último parâmetro de suas funções, enquanto o PostgreSQL costuma receber o resource como primeiro parâmetro.

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.

Utilizar PDO tende a ser mais simples do que utilizar biblioteca de funções, mas continua exigindo conhecimento da sintaxe SQL específica do modelo de SGBD envolvido. Embora muitos programadores ainda utilizam as funções de conexão, existe a promessa de que PDO será o padrão de conexão em PHP 6, enquanto as bibliotecas de funções passarão a ser extensões PECL, precisando ser instaladas a parte.

Comentários:

Mostrando 1 - 10 de 15 comentários
Muito bom o Post, me ajudou muito.
Para exibir os resultados do while basta

$stmt = $pdo->query('SELECT nome, login FROM usuarios');

// Percorrento um resultset com while
while ($obj = $stmt->fetchObject()) {
$obj->nome; //campo que deseja exibir
}

Abraço!
23/11/2011 11:30am (~2 meses atrás)

Olá, venho aqui recomendar, para quem se interessar o uso de uma classe PDO de conexão, a qual já venho utilizando. Possui um repositório no github para poder baixar e utilizar em suas aplicações, ou simplesmente acompanhar e/ou compartilhar.

Segue link: http://bitly.com/PDO4You

Sugestões ou críticas, sempre são bem vindas e ajudam a tornar esta classe ainda melhor para benefício de todos e assim seja até quando o PHP existir. =D

Abraços.
30/07/2011 10:15pm (~6 meses atrás)

Jairo disse:
Rubens, obrigado pela resposta. Pensei que dava pra fazer algo como isto, ou seja, selecionar quais colunas retornar da consulta, mas pelo jeito devo fazer isso de outra forma.

quando tento iterar o objeto PDOStatement aparece algo como:

array
'?' => string 'telefone' (length=8)
0 => string 'nome' (length=4)
1 => string 'endereco' (length=8)
2 => string 'telefone' (length=8)

26/03/2011 12:58pm (~10 meses atrás)

Jairo, na verdade se utiliza os pontos chave para valores variáveis, por exemplo, valores informados pelo usuário.

Prepared Statement inclui aspas quando o conteúdo é string, portanto, seria gerada uma SQL inválida, já que não se informa os campos desejados de um SELECT delimitados por aspas.

Correto:
SELECT nome FROM usuarios;

Errado:
SELECT 'nome' FROM usuarios;
23/03/2011 5:50pm (~10 meses atrás)

Jairo disse:
Muito bom artigo

Usando dessa forma:

$statement = $pdo->prepare('select ?,?,? from pessoa');
$columns = array('nome', 'endereco', 'telefone');
$statement->execute($columns);

// depois ler o resultado do objeto $statement

deveria funcionar ou existe um jeito de funcionar?


23/03/2011 4:46pm (~10 meses atrás)

Parabéns pelo artigo, é realmente motivador!
Obrigado!
31/08/2010 4:57pm (~1 ano atrás)

Trambulhao disse:
Bom artigo, parabéns

Será quem já tem alguém traduzindo no manual do PHP a parte do PDO?
22/03/2010 10:23pm (~1 ano atrás)

Parabéns pelo artigo. Muito importante.
10/03/2010 5:57pm (~1 ano atrás)

Nelson disse:
Parabéns pelo artigo Rubens, muito bem explicadiiinho, legal gostei mesmo.
18/02/2010 12:15am (~2 anos atrás)

Beowulf disse:
conecta.php
<?php
//conecta ao banco de dados
pg_connect( "host=localhost port=5432 dbname=post user=nome_usuario
password=senha_do_banco" ) or die ( "Nao consegui conectar ao PostgreSQL" );

delete.php
?>
<?php include "conection.php"; $sql = pg_exec("DELETE FROM ."$_GET['table_db']." WHERE coment comentario= =".$_GET['coment'].";"); pg_close();
echo "Foi mal aew só para teste,
Eu uso o Postgresql. Mas isso é aula
é meu primeiro post :D
abraços aew a todos e parabens pela aula já estou aprendendo muito"?>

Se quiser apagar este post, tranquilo
09/02/2010 11:26pm (~2 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)