Sobes.tech
Junior

Czym są przygotowane zapytania?

sobes.tech AI

Odpowiedź od AI

Jest to sposób na zwiększenie bezpieczeństwa i wydajności podczas pracy z bazami danych, gdy szablon zapytania SQL jest wysyłany do serwera bazy danych oddzielnie od samych danych.

Zalety:

  • Ochrona przed wstrzyknięciami SQL: Dane są przetwarzane przez serwer bazy danych jako literały, a nie jako część kodu SQL.
  • Wydajność: Serwer bazy danych buforuje plan wykonania zapytania, co oszczędza czas przy wielokrotnym wykonywaniu tego samego zapytania z różnymi parametrami.
  • Wygoda: Pozwalają na strukturyzację kodu i ułatwiają debugowanie.

Etapy wykonania przygotowanego zapytania:

  1. Przygotowanie (Prepare): Szablon zapytania jest wysyłany do serwera bazy danych w celu analizy, sprawdzenia składni i zbudowania planu wykonania. Szablon używa placeholderów do oznaczenia miejsc, w które będą podstawiane dane.
  2. Powiązanie (Bind): Wartości zmiennych są wiązane z placeholderami. Serwer nie interpretuje ich jako kodu SQL.
  3. Wykonanie (Execute): Zapytanie jest wykonywane z powiązanymi wartościami.

Przykład użycia przygotowanego zapytania w PHP z PDO:

// Połączenie z bazą danych (przykład)
$dsn = 'mysql:host=localhost;dbname=mojabaza';
$user = 'mojuzytkownik';
$password = 'mojehaslo';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Błąd połączenia: ' . $e->getMessage());
}

// Przygotowanie zapytania z placeholderami
$stmt = $pdo->prepare("SELECT imie, email FROM uzytkownicy WHERE id = :id");

// Powiązanie wartości z placeholderem
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);

// Wykonanie zapytania
$stmt->execute();

// Pobranie wyników
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Imię użytkownika: " . htmlspecialchars($user['imie']) . "<br>";
    echo "Email użytkownika: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Użytkownik o ID " . htmlspecialchars($userId) . " nie został znaleziony.";
}

W tym przykładzie :id jest nazwanym placeholderem. Można też używać placeholderów pozycyjnych (?).

// Przygotowanie zapytania z placeholderem pozycyjnym
$stmt = $pdo->prepare("SELECT imie, email FROM uzytkownicy WHERE id = ?");

// Wykonanie zapytania z tablicą wartości
$userId = 2;
$stmt->execute([$userId]);

// Pobranie wyników
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Imię użytkownika: " . htmlspecialchars($user['imie']) . "<br>";
    echo "Email użytkownika: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Użytkownik o ID " . htmlspecialchars($userId) . " nie został znaleziony.";
}
?>