Como usar consultas preparadas (prepared statements) no PHP com MySQL?
As consultas preparadas (prepared statements) são um método seguro de executar comandos SQL, impedindo ataques de SQL Injection. Elas garantem que os dados fornecidos pelo usuário sejam tratados como valores e não como comandos SQL maliciosos.
Usando Prepared Statements com MySQLi
Podemos usar MySQLi para criar uma consulta preparada:
<?php
$conexao = new mysqli("localhost", "usuario", "senha", "meu_banco");
if ($conexao->connect_error) {
die("Erro na conexão: " . $conexao->connect_error);
}
$stmt = $conexao->prepare("SELECT * FROM usuarios WHERE email = ?");
$stmt->bind_param("s", $email);
$email = "usuario@email.com";
$stmt->execute();
$resultado = $stmt->get_result();
while ($linha = $resultado->fetch_assoc()) {
echo "Nome: " . $linha["nome"] . " - Email: " . $linha["email"] . "<br>";
}
?>
Aqui, bind_param("s", $email)
define que o parâmetro será tratado como string (s
), protegendo contra injeções SQL.
Usando Prepared Statements com PDO
O PDO permite um uso mais flexível e seguro:
<?php
try {
$conexao = new PDO("mysql:host=localhost;dbname=meu_banco", "usuario", "senha");
$conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM usuarios WHERE email = :email";
$stmt = $conexao->prepare($sql);
$stmt->bindParam(':email', $email);
$email = "usuario@email.com";
$stmt->execute();
while ($linha = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "Nome: " . $linha["nome"] . " - Email: " . $linha["email"] . "<br>";
}
} catch (PDOException $e) {
echo "Erro: " . $e->getMessage();
}
?>
Aqui, usamos bindParam(':email', $email)
, garantindo que o valor não seja interpretado como parte do SQL.
Por que utilizar consultas preparadas no PHP com MySQL?
O uso de prepared statements no PHP é essencial para proteger aplicações contra SQL Injection. Além da segurança, consultas preparadas também melhoram a performance ao reutilizar queries pré-compiladas. Entre MySQLi e PDO, a escolha depende do projeto, mas PDO oferece maior flexibilidade ao permitir o uso de diferentes bancos de dados.
Algumas aplicações:
- Criação de sistemas seguros contra SQL Injection
- Autenticação segura de usuários em sistemas web
- Manipulação eficiente de dados em bancos MySQL
- Melhoria no desempenho ao executar múltiplas consultas similares
Dicas para quem está começando
- Sempre utilize prepared statements ao receber dados do usuário.
- Evite concatenar valores diretamente nas queries SQL.
- Use PDO se precisar de compatibilidade com outros bancos.
- Prefira
bindParam()
para maior controle sobre os parâmetros. - Ative
PDO::ERRMODE_EXCEPTION
para capturar erros e evitar falhas silenciosas.
Contribuições de Rafael Nogueira