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:
- 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.
- Väzba (Bind): Hodnoty premenných sa viažu na zástupné znaky. Server ich neinterpretuje ako SQL kód.
- 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ý.";
}
?>