Sobes.tech
Junior

Mi azok a prepared kérdések?

sobes.tech MI

Válasz az MI-től

Ez egy módszer a biztonság és a teljesítmény növelésére az adatbázisokkal való munkában, amikor az SQL-lekérdezés sablonját külön küldik az adatbázis szervernek az adatoktól.

Előnyök:

  • Védelem az SQL-injekciók ellen: Az adatok a adatbázis szerver által literálként kerülnek feldolgozásra, nem pedig az SQL-kód részeként.
  • Teljesítmény: Az adatbázis szerver cache-eli a lekérdezés végrehajtási tervét, így időt takarít meg ugyanazon lekérdezés többszöri végrehajtásakor különböző paraméterekkel.
  • Kényelem: Lehetővé teszik a kód strukturálását és megkönnyítik a hibakeresést.

A készített lekérdezés végrehajtási lépései:

  1. Előkészítés (Prepare): A lekérdezés sablonját elküldik az adatbázis szervernek elemzésre, szintaxis ellenőrzésre és végrehajtási terv készítésére. A sablon helykitöltőket használ, hogy jelezze, hova kerülnek az adatok.
  2. Kötés (Bind): A változók értékeit a helykitöltőkhöz kötjük. A szerver nem értelmezi őket SQL-kódként.
  3. Végrehajtás (Execute): A lekérdezést a kötött értékekkel hajtják végre.

Példa a PDO-val PHP-ben készített előkészített lekérdezésre:

// Kapcsolódás az adatbázishoz (példa)
$dsn = 'mysql:host=localhost;dbname=adatbazisom';
$user = 'felhasznalo';
$password = 'jelszo';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Kapcsolódási hiba: ' . $e->getMessage());
}

// Előkészítés helykitöltőkkel
$stmt = $pdo->prepare("SELECT nev, email FROM felhasznalok WHERE id = :id");

// Érték kötése a helykitöltőhöz
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);

// Lekérdezés végrehajtása
$stmt->execute();

// Eredmények lekérése
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Felhasználó neve: " . htmlspecialchars($user['nev']) . "<br>";
    echo "Felhasználó email címe: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Nem található felhasználó ID-vel " . htmlspecialchars($userId) . ".";
}

Ebben a példában a :id egy névvel ellátott helykitöltő. A kérdőjelet (?) tartalmazó helykitöltőket is lehet használni.

// Pozíció alapú helykitöltővel készített lekérdezés
$stmt = $pdo->prepare("SELECT nev, email FROM felhasznalok WHERE id = ?");

// A lekérdezés végrehajtása értékek tömbjével
$userId = 2;
$stmt->execute([$userId]);

// Eredmények lekérése
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Felhasználó neve: " . htmlspecialchars($user['nev']) . "<br>";
    echo "Felhasználó email címe: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Nem található felhasználó ID-vel " . htmlspecialchars($userId) . ".";
}
?>