Sobes.tech
Junior

Čo sú pripravené dotazy?

sobes.tech AI

Odpoveď od AI

Toto je spôsob zvýšenia bezpečnosti a výkonu pri práci s databázami, keď je šablóna SQL dotazu odoslaná serveru databázy samostatne od samotných dát.

Výhody:

  • Ochrana pred SQL injekciami: Dáta sú spracovávané serverom databázy ako literály, nie ako súčasť SQL kódu.
  • Výkon: Server databázy cacheuje plán vykonania dotazu, čo šetrí čas pri opakovanom vykonávaní toho istého dotazu s rôznymi parametrami.
  • Pohodlie: Umožňujú štruktúrovať kód a zjednodušujú ladenie.

Fázy vykonávania pripraveného dotazu:

  1. Príprava (Prepare): Šablóna dotazu sa odosiela na server na analýzu, kontrolu syntaxe a tvorbu plánu vykonania. V šablóne sú použité zástupné znaky na označenie miest, kam budú vkladané dáta.
  2. Väzba (Bind): Hodnoty premenných sa viažu na zástupné znaky. Server ich neinterpretuje ako SQL kód.
  3. Vykonanie (Execute): Dotaz sa vykoná s naviazanými hodnotami.

Príklad použitia pripraveného dotazu v PHP s PDO:

// Pripojenie k databáze (príklad)
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$pouzivatel = 'myuser';
$heslo = 'mypassword';

try {
    $pdo = new PDO($dsn, $pouzivatel, $heslo);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Chyba pripojenia: ' . $e->getMessage());
}

// Príprava dotazu s zástupnými znakmi
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = :id");

// Väzba hodnoty na zástupný znak
$uzivatelId = 1;
$stmt->bindParam(':id', $uzivatelId, PDO::PARAM_INT);

// Vykonanie dotazu
$stmt->execute();

// Získanie výsledkov
$uzivatel = $stmt->fetch(PDO::FETCH_ASSOC);

if ($uzivatel) {
    echo "Meno používateľa: " . htmlspecialchars($uzivatel['name']) . "<br>";
    echo "Email používateľa: " . htmlspecialchars($uzivatel['email']) . "<br>";
} else {
    echo "Používateľ s ID " . htmlspecialchars($uzivatelId) . " nebol nájdený.";
}

V tomto príklade je :id pomenovaný zástupný znak. Môžu sa použiť aj pozičné zástupné znaky (?).

// Príprava dotazu s pozičným zástupným znakom
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = ?");

// Vykonanie dotazu s poľom hodnôt pre zástupné znaky
$uzivatelId = 2;
$stmt->execute([$uzivatelId]);

// Získanie výsledkov
$uzivatel = $stmt->fetch(PDO::FETCH_ASSOC);

if ($uzivatel) {
    echo "Meno používateľa: " . htmlspecialchars($uzivatel['name']) . "<br>";
    echo "Email používateľa: " . htmlspecialchars($uzivatel['email']) . "<br>";
} else {
    echo "Používateľ s ID " . htmlspecialchars($uzivatelId) . " nebol nájdený.";
}
?>