Usando PDO do PHP

Fala pessoal, vocês conhecem o PDO? Sabe pra que serve? Já usaram ele?

Nesse post irei explicar o que é PDO e os benefícios de seu uso.

PHP Data Objects - PDO nada mais é do que uma interface para banco de dados. Podemos dizer que é uma "classe universal" que nos fornece uma camada de abstração para vários SGBD's (MySQL, PostgreSQL etc) diferentes.

Usando PDO do PHP

O bom dele é que podemos usar os mesmos métodos para manipulação de dados independente do SGBD, sem contar na segurança contra injeção de SQL.

O PHP usa o driver específico de cada banco de dados, mas a interface para o programador é a mesma, implementada com PDO.

Para exemplificar, criei um cadastro de usuários simples onde faço manipulação com PDO.

Vamos começar pela conexão com o banco de dados:

<?php
try{
// Faz conexão com banco de daddos
$pdo = new PDO("mysql:host=127.0.0.1;dbname=glauco_blog_tutorials_db;","root", "");
}catch(PDOException $e){
// Caso ocorra algum erro na conexão com o banco, exibe a mensagem
echo 'Falha ao conectar no banco de dados: '.$e->getMessage();
die;
}
?>

Observe que se não estivessemos usando PDO, teriamos que usar funções específicas de cada banco de dados, por exemplo, se fossemos conectar com um banco MySQL, teríamos que usar a função mysql_connect (aliás, o uso dessa função é desencorajado pela documentação oficial do PHP), caso fossemos conectar com um banco PostgreSQL, teríamos que usar a função pg_connect e assim por diante com cada banco de dados diferente.

PDO nos provê uma interface genérica para todos os bancos de dados, facilitando a manutenção e padronização do código.

Vamos à execução de querys agora..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// Prepara uma sentença para ser executada
$statement = $pdo->prepare('INSERT INTO users (name, username, password) VALUES (:name, :username, :password)');

// Filtra os dados e armazena em variáveis (o filtro padrão é FILTER_SANITIZE_STRING que remove tags HTML)
$name = filter_var($post['name']);
$username = filter_var($post['username']);
$password = filter_var($post['password']);

// Adiciona os dados acima para serem executados na sentença
$statement->bindParam(':name', $name);
$statement->bindParam(':username', $username);
$statement->bindParam(':password', $password);

// Executa a sentença já com os valores
if($statement->execute()){
// Definimos a mensagem de sucesso
$_SESSION['message'] = 'Usuário cadastrado com sucesso';
}else{
// Definimos a mensagem de erro
$_SESSION['message'] = 'Falha ao cadastrar usuário';
}
?>

Repare na linha 3 acima, nós não executamos a query de insert diretamente (como fariamos se estivessemos usando um mysql_query da vida), por segurança, recomenda-se o uso de prepared statements, que são sentenças usando parâmetros. Invés de colocarmos as variáveis diretamente na query, primeiro filtramos elas com filter_var que remove tags HTML e depois damos um bind na sentença, ou seja, associamos os parâmetros às variáveis, isso previne contra o uso de injeções SQL.

<?php
$delete = $pdo->exec('DELETE FROM users WHERE id = '. base64_decode($get['id']));
?>

Para querys que não precisam de retorno do banco como acima, usamos o método exec da classe PDO para simplificar o trabalho, ele apenas nos retorna o número de registros afetados (no caso de uma exclusão por id, retornaria o valor 1 caso o registro existisse no banco).

<?php foreach($pdo->query('SELECT * FROM users') as $c): ?>
<tr>
<td>
<?php echo $c['name']; ?>
</td>
<td>
<?php echo $c['username']; ?>
</td>
<td>
<a onclick="return window.confirm('Deseja mesmo excluir?')" href="delete.php?id=<?php echo base64_encode($c['id']) ?>">Excluir</a>
</td>
</tr>
<?php endforeach; ?>

E por fim mas não menos importante, para retornarmos registros como em uma listagem, usamos o método query passando a sentença SQL que desejamos executar, ele nos retorna o conjunto de dados pesquisados.

É isso ai pessoal, se vocês desejam não ter problemas futuros com manutenção, segurança e padronização, é altamente recomendado o uso dessa classe, sem contar que ela é voltada para o paradigma atual de desenvolvimento, que é a orientação a objetos. Para mais dúvidas confiram a documentação oficial dela aqui.

Em posts futuros estarei fazendo uso de banco de dados e sempre utilizarei PDO como interface, se precisar, você pode conferir e fazer download desse exemplo completo em meu GitHub.

E você, o que acha dessa classe?

Até mais.

Written on August 4, 2012

Share: