Przejdź do treści głównej
INF.03Backend & PHP

PDO (PHP Data Objects) i Prepared Statements

Lekka, spójna warstwa abstrakcji dostępu do baz danych w PHP, zabezpieczająca aplikację przed atakami SQL Injection dzięki zapytaniom parametryzowanym.

Połączenie z bazą i Prepared Statements w PDO:

PHP
<?php
$dsn = 'mysql:host=localhost;dbname=sklep;charset=utf8mb4';
$user = 'root';
$pass = '';

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);

    // Bezpieczne zapytanie z parametrem wiązanym:
    $stmt = $pdo->prepare('SELECT id, nazwa, cena FROM produkty WHERE kategoria_id = :kat AND cena < :cena');
    $stmt->execute([
        ':kat' => 3,
        ':cena' => 100.00
    ]);
    
    $produkty = $stmt->fetchAll();

    foreach ($produkty as $p) {
        echo htmlspecialchars($p['nazwa']) . ' - ' . $p['cena'] . ' zł<br>';
    }
} catch (PDOException $e) {
    echo 'Błąd połączenia z bazą: ' . $e->getMessage();
}

Dlaczego PDO jest lepsze od mysqli?

  1. Wspiera wiele różnych silników baz danych (MySQL, PostgreSQL, SQLite, Oracle), podczas gdy mysqli obsługuje tylko MySQL.
  2. Wymusza czystą obsługę wyjątków (PDOException).
  3. Pozwala na bezpieczne parametryzowanie zapytań (Prepared Statements).

Najczęstsze pułapki na egzaminie INF.03:

  • Pamiętaj, aby zawsze ustawić kodowanie znaków w DSN (charset=utf8mb4), aby uniknąć problemów z polskimi znakami.

Chcesz sprawdzić to pojęcie w praktyce?

Przeszukaj pytania z oficjalnych arkuszy CKE powiązane z hasłem PDO (PHP Data Objects) i Prepared Statements lub rozpocznij trening.