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:
- 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.
- Powiązanie (Bind): Wartości zmiennych są wiązane z placeholderami. Serwer nie interpretuje ich jako kodu SQL.
- 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.";
}
?>