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

  1. 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.
  2. Legare (Bind): Valorile variabilelor sunt legate de placeholder-uri. Serverul nu le interpretează ca și cod SQL.
  3. 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.";
}
?>