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:
- 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.
- Binding (Bind): I valori delle variabili vengono associati ai placeholder. Il server non li interpreta come codice SQL.
- 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.";
}
?>