PHP PDO (PHP Data Objects)

Verbindung & DSN

// dsn (data source name)
$dsn = 'mysql:host=localhost;dbname=datenbank;charset=utf8mb4';


// verbindung herstellen
$pdo = new PDO($dsn, 'username', 'passwort', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,        // exceptions bei fehlern
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,   // standard: assoziatives array
    PDO::ATTR_EMULATE_PREPARES => false                 // echte prepared statements
]);
???
???
???
???

Prepared Statements & Ausführung

// Parameter placeholder (?)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute(['email@example.com']);
$user = $stmt->fetch();

// Benannte Parameter (:name)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id AND status = :status");
$stmt->execute([':id' => 1, ':status' => 'aktiv']);


Fetch-Modi

$stmt->fetch();           // 1 Zeile
$stmt->fetchAll();        // Alle Zeilen
$stmt->fetchColumn(0);    // Spalte 0 (1. Spalte)

// FETCH_MODES
FETCH_ASSOC  // Assoziatives Array ['spalte' => wert]
FETCH_NUM    // Numerisches Array [0 => wert]
FETCH_BOTH   // Beides
FETCH_OBJ    // Objekte
FETCH_CLASS  // Benutzerdefinierte Klasse


Binding (manuell)

$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bindValue(1, 'Max', PDO::PARAM_STR);
$stmt->bindValue(2, 'max@test.de', PDO::PARAM_STR);
$stmt->execute();

// Oder direkt beim Execute
$stmt->execute(['Max', 'max@test.de']);

Nützliche Methoden

$stmt->rowCount();        // Betroffene Zeilen (INSERT/UPDATE/DELETE)
$pdo->lastInsertId();     // Letzte eingefügte ID
$pdo->beginTransaction(); // Transaktion starten
$pdo->commit();           // Transaktion abschließen
$pdo->rollBack();         // Transaktion abbrechen
$pdo->query("SELECT ...");// Direkte Query (nie mit User-Input!)

Fehlerbehandlung

try {
    $pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

Standard Query (ohne Prepared Statement)

// NUR für fixe Queries OHNE User-Input!
$stmt = $pdo->query("SELECT id, name FROM users WHERE status = 'aktiv'");

While-Loop mit fetch()

$stmt = $pdo->query("SELECT id, name, email FROM users");

while ($row = $stmt->fetch()) {
    echo $row['name'] . " - " . $row['email'] . "<br>";
}

Oder als alternatives Pattern:

while (($row = $stmt->fetch()) !== false) {
    // ...
}

Wichtig