Junior
Ce sunt interogările pregătite?
sobes.tech AI
Răspuns de la AI
Aceasta este o metodă de creștere a securității și performanței atunci când se lucrează cu baze de date, în care șablonul interogării SQL este trimis serverului bazei de date separat de date.
Avantaje:
- Protecție împotriva injecțiilor SQL: Datele sunt procesate de serverul bazei de date ca literali, nu ca parte a codului SQL.
- Performanță: Serverul bazei de date cachează planul de execuție al interogării, economisind timp la executarea repetată a aceleiași interogări cu parametri diferiți.
- Confort: Permite structurarea codului și facilitează depanarea.
Etapele de execuție ale unei interogări pregătite:
- Pregătire (Prepare): Șablonul interogării este trimis serverului bazei de date pentru analiză, verificare sintaxă și construire a planului de execuție. Șablonul utilizează placeholder-uri pentru a indica locurile unde vor fi inserate date.
- Legare (Bind): Valorile variabilelor sunt legate de placeholder-uri. Serverul nu le interpretează ca și cod SQL.
- Executare (Execute): Interogarea este executată cu valorile legate.
Exemplu de utilizare a unei interogări pregătite în PHP cu PDO:
// Conectare la baza de date (exemplu)
$dsn = 'mysql:host=localhost;dbname=bazadedate';
$user = 'utilizator';
$password = 'parola';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Eroare de conectare: ' . $e->getMessage());
}
// Pregătirea interogării cu placeholder-uri
$stmt = $pdo->prepare("SELECT nume, email FROM utilizatori WHERE id = :id");
// Legarea valorii la placeholder
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
// Executarea interogării
$stmt->execute();
// Obținerea rezultatelor
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Numele utilizatorului: " . htmlspecialchars($user['nume']) . "<br>";
echo "Email-ul utilizatorului: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Utilizator cu ID " . htmlspecialchars($userId) . " nu a fost găsit.";
}
În acest exemplu, :id este un placeholder cu nume. De asemenea, se pot folosi placeholder-uri poziționale (?).
// Pregătirea interogării cu placeholder pozițional
$stmt = $pdo->prepare("SELECT nume, email FROM utilizatori WHERE id = ?");
// Executarea interogării cu un array de valori
$userId = 2;
$stmt->execute([$userId]);
// Obținerea rezultatelor
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Numele utilizatorului: " . htmlspecialchars($user['nume']) . "<br>";
echo "Email-ul utilizatorului: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Utilizator cu ID " . htmlspecialchars($userId) . " nu a fost găsit.";
}
?>