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

  1. 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.
  2. Vazba (Bind): Hodnoty proměnných jsou vázány na zástupné znaky. Server je neinterpretuje jako SQL kód.
  3. 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.";
}
?>