Introdução
Quando se trata de desenvolvimento web com PHP, a interação com bancos de dados é uma parte fundamental da maioria dos projetos. Durante anos, muitos desenvolvedores utilizaram as funções mysql_* para essa tarefa, mas essas funções estão obsoletas desde o PHP 5.5.0 e foram removidas no PHP 7.0. A alternativa moderna e recomendada é o PDO (PHP Data Objects), uma camada de acesso a dados que fornece uma maneira consistente de acessar diferentes sistemas de banco de dados.
O que é PDO?
PDO é uma extensão do PHP que fornece uma interface leve e consistente para acessar bancos de dados em PHP. Diferente de extensões específicas como mysql_* ou mysqli, o PDO oferece uma camada de abstração que permite trabalhar com múltiplos bancos de dados (MySQL, PostgreSQL, SQLite, Oracle, etc.) usando os mesmos métodos.
Principais vantagens do PDO
1. Abstração de banco de dados: Escreva um código que funcione com vários bancos de dados com mudanças mínimas.
2. Prepared statements: Proteção contra injeção SQL de forma nativa.
3. Tratamento de erros: Múltiplos modos de tratamento de erros para um debugging mais eficiente.
4. Transações: Suporte completo a transações de banco de dados.
5. Performance: Quase tão rápido quanto as extensões específicas, com muito mais recursos.
Como usar o PDO
Conexão com o banco de dados
<?php
$host = 'localhost';
$db = 'nome_do_banco';
$user = 'usuario';
$pass = 'senha';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>
Executando consultas simples
// Consulta sem parâmetros
$stmt = $pdo->query('SELECT * FROM usuarios');
while ($row = $stmt->fetch()) {
echo $row['nome'] . "\n";
}
Usando prepared statements
// Consulta com parâmetros
$stmt = $pdo->prepare('SELECT * FROM usuarios WHERE id = ? AND status = ?');
$stmt->execute([$id, $status]);
$user = $stmt->fetch();
// Com parâmetros nomeados
$stmt = $pdo->prepare('SELECT * FROM usuarios WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
Inserindo dados
$data = [
'nome' => 'João Silva',
'email' => 'joao@example.com'
];
$sql = "INSERT INTO usuarios (nome, email) VALUES (:nome, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
Transações
try {
$pdo->beginTransaction();
// Executar várias operações
$pdo->exec("UPDATE conta SET saldo = saldo - 100 WHERE id = 1");
$pdo->exec("UPDATE conta SET saldo = saldo + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "Falha na transação: " . $e->getMessage();
}
Boas práticas com PDO
1. Sempre use prepared statements: Isso evita injeção SQL e melhora a segurança.
2. Defina o modo de erro para ERRMODE_EXCEPTION: Isso facilita o tratamento de erros.
3. Desative prepared statements emulados: Definir `ATTR_EMULATE_PREPARES` como false garante que os prepared statements sejam feitos no banco de dados, não no PHP.
4. Use fetch modes adequados: `FETCH_ASSOC` geralmente é mais eficiente que `FETCH_BOTH`.
5. Feche as conexões: Embora o PHP feche automaticamente, é boa prática fechar explicitamente quando não for mais necessária.
Conclusão
O PDO é uma ferramenta poderosa e segura para trabalhar com bancos de dados em PHP. Ele oferece uma API consistente, proteção contra injeção SQL através de prepared statements e suporte a múltiplos bancos de dados. Ao migrar para PDO, você estará adotando as melhores práticas de desenvolvimento PHP moderno, garantindo código mais seguro, manutenível e portável.
Se você ainda não está usando PDO em seus projetos, agora é o momento perfeito para começar a fazer a transição. Seus futuros colegas de equipe (e seu aplicativo) agradecerão!