Sobes.tech
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:

  1. 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.
  2. Ligação (Bind): Os valores das variáveis são ligados aos placeholders. O servidor não os interpreta como código SQL.
  3. 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.";
}
?>