Junior
O que são consultas preparadas?
sobes.tech IA
Resposta da IA
É uma forma de aumentar a segurança e o desempenho ao trabalhar com bases de dados, quando o modelo de consulta SQL é enviado ao servidor de base de dados separadamente dos próprios dados.
Vantagens:
- Proteção contra injeções SQL: Os dados são processados pelo servidor de base de dados como literais, e não como parte do código SQL.
- Desempenho: O servidor de base de dados armazena em cache o plano de execução da consulta, o que economiza tempo ao executar a mesma consulta várias vezes com diferentes parâmetros.
- Conveniência: Permitem estruturar o código e facilitam a depuração.
Etapas de execução de uma consulta preparada:
- Preparação (Prepare): O modelo de consulta é enviado ao servidor de base de dados para análise, verificação de sintaxe e construção do plano de execução. O modelo usa placeholders para indicar os locais onde os dados serão inseridos.
- Ligação (Bind): Os valores das variáveis são ligados aos placeholders. O servidor não os interpreta como código SQL.
- Execução (Execute): A consulta é executada com os valores ligados.
Exemplo de uso de uma consulta preparada em PHP com PDO:
// Conexão à base de dados (exemplo)
$dsn = 'mysql:host=localhost;dbname=meuBancoDeDados';
$user = 'meuusuario';
$password = 'minhasenha';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Erro de conexão: ' . $e->getMessage());
}
// Preparação da consulta com placeholders
$stmt = $pdo->prepare("SELECT nome, email FROM utilizadores WHERE id = :id");
// Ligação do valor ao placeholder
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
// Execução da consulta
$stmt->execute();
// Obtenção dos resultados
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Nome do utilizador: " . htmlspecialchars($user['nome']) . "<br>";
echo "Email do utilizador: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Utilizador com ID " . htmlspecialchars($userId) . " não encontrado.";
}
Neste exemplo, :id é um placeholder com nome. Também é possível usar placeholders posicionais (?).
// Preparação da consulta com placeholder posicional
$stmt = $pdo->prepare("SELECT nome, email FROM utilizadores WHERE id = ?");
// Execução da consulta com um array de valores para o placeholder
$userId = 2;
$stmt->execute([$userId]);
// Obtenção dos resultados
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Nome do utilizador: " . htmlspecialchars($user['nome']) . "<br>";
echo "Email do utilizador: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Utilizador com ID " . htmlspecialchars($userId) . " não encontrado.";
}
?>