PDO: Outra maneira de acessar seus bancos de dados

Novembro 2016

PHP Data Objects (PDO) é uma extensão PHP que define uma interface de acesso a um banco de dados. Ele tem, de uma certa maneira, a mesma função que o mysql_connect, mysql_query, etc. Ele está incluído no PHP desde a versão 5.1. Quanto à versão 5.0, você pode obtê-la com a extensão PECL.



O que PDO tem a mais que as funções mysql_...

Sua principal vantagem é que ele permite uma abstração para o acesso aos dados. Isso significa que as funções para executar os pedidos e recuperar os dados são os mesmos, seja qual for o servidor SQL utilizado (MySQL, PostgreSQL, etc.). Por exemplo, se você passa do MySQL para o PostegreSQL, você não precisa converter todo o seu código como com as funções mysql_ (mysql_connect seria substituído pelo mysql_query e o pgsql_connect pelo pgsql_query, etc.). Mas, como cada servidor SQL não executa os pedidos SQL da mesma maneira, talvez você precise reescrever certos pedidos. PDO também é orientado a objetos, assim, você poderá ampliá-lo e gerenciar os erros com as exceções.

Como se conectar com o seu servidor SQL

Esta é a parte mais simples. Veja este código:
<?php  
$pdo = new PDO('mysql:host=localhost;dbname=seu_banco', 'usuário', 'senha');
?>
Eu sublinhei o que você pode modificar:
mysql é o nome do driver utilizado. Se você usar o PostegreSQL, será o pgsql. Quanto aos outros, veja aqui.
localhost é o alojador SQL. É o primeiro argumento que você vai dar na função mysql_connect.
seu_banco é o nome do seu banco de dados. Isto é o que você vai colocar na função mysql_select_db.
usuário é o nome do usuário.
senha é a sua senha.

Como executar uma consulta sem retorno

O que chamamos de uma consulta sem retorno? É uma consulta que não retorna nenhum dado, como as que deletam, alteram ou inserem dados. As que retornam dados são aquelas que começam com SELECT.... Para este tipo de aplicação, é preferível utilizar o método exec(), que retorna o número de linhas afetadas. Veja este exemplo:

<?php     
require 'sqlconnect.php';     

$sql = 'DELETE FROM accouns WHERE type = "member"';  
$prepare = $pdo->prepare($sql);   
$res = $prepare ->exec($sql);     
$nb = $prepare ->rowCount();

echo $nb.' members foi removido.';     
?>

Neste exemplo, vamos eliminar todas as contas do tipo member (e manteremos os "admin" e os "modo"). Como você pode ver, a variável $nb contém o número de linhas afetadas (neste caso, excluídas) pela sua consulta.

Como recuperar os dados

Para recuperar os dados em um banco de dados, vamos usar o método query() da classe DOP. Esse método retorna um objeto do tipo PDOStatement. A classe PDOStatement propõe um método para recuperar, linha por linha, os resultados fetch().

Nós podemos passá-lo na argumentação a forma em que queremos recuperar os dados: uma tabela (padrão), um objeto, etc. Para não precisar ficar indicando como queremos recuperar os dados, ao chamar o método fetch(), podemos indica-lo com o setFetchMode(), uma vez por todas.

Para proteger nossas consultas contra as injeções de SQL, vamos usar o método quote() da classe PDO. Ele adicionará as aspas nas strings e evitará as injeções dobrando as aspas dentro da cadeia de caracteres.

Resumindo, veja este exmplo:
 1. <?php    
2. require 'sqlconnect.php';
3.
4. $sql = 'SELECT * FROM members';
5. $req = $pdo->query($sql);
6. while($row = $req->fetch()) {
7. echo '<a href="member-'.$row['id'].'.html">'.$row['pseudo'].'</a><br/>';
8. }
9. $req->closeCursor();
10.?>
Vamos analisar este script :
Linha 2: vamos incluir a script sqlconnect.php que vai se conectar com a MySQL, como vimos acima.
Linha 4: armazenamos na variável $sql uma consulta SQL para recuperar todos os campos de todas as entradas na tabela members.
Linha 5: executamos a consulta SQL e armazenamos (um objeto PDOStatement) na variável $req.
Linha 6: nós fizemos um loop para cada entrada. Como eu disse acima, o método fetch() retorna as entradas (linhas), uma por uma. Quando há mais, então ele retorna false e o loop para. A entrada é armazenada na variável $row. Esta variável é tanto uma tabela que contém uma chave para cada campo, quanto um número. Se "id" é o primeiro campo na sua tabela, então nós poderemos recupera-lo com $row[0] e $row['id']. Eu prefiro usar o segundo.
Linha 7: este é um simples eco que direciona para a página de perfil de cada membro. Nada de muito complicado. Deliberadamente, coloquei espaços, para que o CCM.net não transforme o HTML em um verdadeiro link.
Linha 9: nós fechamos o cursor porque não precisamos mais desta variável.

Para proteger suas consultas contra as injeções SQL com o método quote(), eu sugiro que veja este exemplo:
:
$sql = 'SELECT * FROM members WHERE pseudo = '.$pdo->quote($pseudoMember);

Foto: © Mysql.

Veja também :
Este documento, intitulado « PDO: Outra maneira de acessar seus bancos de dados »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.