Junior
Co jsou to připravené dotazy?
sobes.tech AI
Odpověď od AI
Toto je způsob zvýšení bezpečnosti a výkonu při práci s databázemi, kdy je šablona SQL dotazu odeslána serveru databáze samostatně od samotných dat.
Výhody:
- Ochrana před SQL-injekcemi: Data jsou zpracovávána serverem databáze jako literály, nikoli jako součást SQL kódu.
- Výkon: Server databáze ukládá do mezipaměti plán provádění dotazu, což šetří čas při opakovaném provádění stejného dotazu s různými parametry.
- Pohodlí: Umožňují strukturovat kód a zjednodušují ladění.
Fáze provádění připraveného dotazu:
- Příprava (Prepare): Šablona dotazu je odeslána serveru databáze k analýze, kontrole syntaxe a tvorbě plánu provádění. Ve šabloně jsou použity zástupné znaky pro označení míst, kam budou dosazovány data.
- Vazba (Bind): Hodnoty proměnných jsou vázány na zástupné znaky. Server je neinterpretuje jako SQL kód.
- Provedení (Execute): Dotaz je proveden s navázanými hodnotami.
Příklad použití připraveného dotazu v PHP s PDO:
// Připojení k databázi (příklad)
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$user = 'myuser';
$password = 'mypassword';
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Chyba připojení: ' . $e->getMessage());
}
// Příprava dotazu s zástupnými znaky
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = :id");
// Vazba hodnoty na zástupný znak
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
// Provedení dotazu
$stmt->execute();
// Získání výsledků
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Jméno uživatele: " . htmlspecialchars($user['name']) . "<br>";
echo "Email uživatele: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Uživatel s ID " . htmlspecialchars($userId) . " nebyl nalezen.";
}
V tomto příkladu je :id pojmenovaný zástupný znak. Také je možné použít poziční zástupné znaky (?).
// Příprava dotazu s pozičním zástupným znakem
$stmt = $pdo->prepare("SELECT name, email FROM users WHERE id = ?");
// Provedení dotazu s polem hodnot pro zástupný znak
$userId = 2;
$stmt->execute([$userId]);
// Získání výsledků
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Jméno uživatele: " . htmlspecialchars($user['name']) . "<br>";
echo "Email uživatele: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Uživatel s ID " . htmlspecialchars($userId) . " nebyl nalezen.";
}
?>