Sobes.tech
Junior

Cosa sono le query preparate?

sobes.tech AI

Risposta dell'AI

È un metodo per aumentare la sicurezza e le prestazioni quando si lavora con i database, in cui il modello di query SQL viene inviato al server del database separatamente dai dati stessi.

Vantaggi:

  • Protezione contro le injection SQL: I dati vengono elaborati dal server del database come letterali, non come parte del codice SQL.
  • Prestazioni: Il server del database memorizza nella cache il piano di esecuzione della query, risparmiando tempo quando si esegue più volte la stessa query con parametri diversi.
  • Comodità: Permettono di strutturare il codice e semplificano il debug.

Fasi di esecuzione di una query preparata:

  1. Preparazione (Prepare): Il modello di query viene inviato al server del database per analisi, verifica della sintassi e costruzione del piano di esecuzione. Il modello utilizza placeholder per indicare i punti in cui verranno inseriti i dati.
  2. Binding (Bind): I valori delle variabili vengono associati ai placeholder. Il server non li interpreta come codice SQL.
  3. Esecuzione (Execute): La query viene eseguita con i valori associati.

Esempio di utilizzo di una query preparata in PHP con PDO:

// Connessione al database (esempio)
$dsn = 'mysql:host=localhost;dbname=miodatabase';
$user = 'mioutente';
$password = 'miasenha';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Errore di connessione: ' . $e->getMessage());
}

// Preparazione della query con placeholder
$stmt = $pdo->prepare("SELECT nome, email FROM utenti WHERE id = :id");

// Binding del valore al placeholder
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);

// Esecuzione della query
$stmt->execute();

// Recupero dei risultati
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Nome utente: " . htmlspecialchars($user['nome']) . "<br>";
    echo "Email utente: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Utente con ID " . htmlspecialchars($userId) . " non trovato.";
}

In questo esempio, :id è un placeholder con nome. È anche possibile usare placeholder posizionali (?).

// Preparazione della query con placeholder posizionale
$stmt = $pdo->prepare("SELECT nome, email FROM utenti WHERE id = ?");

// Esecuzione della query con un array di valori
$userId = 2;
$stmt->execute([$userId]);

// Recupero dei risultati
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Nome utente: " . htmlspecialchars($user['nome']) . "<br>";
    echo "Email utente: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Utente con ID " . htmlspecialchars($userId) . " non trovato.";
}
?>