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']);
CRUD Beispiele
// SELECT (mehrere)
$stmt = $pdo->prepare("SELECT * FROM users WHERE role = ?");
$stmt->execute(['admin']);
$users = $stmt->fetchAll();
// SELECT (einzeln)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
$user = $stmt->fetch();
// INSERT
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute([$name, $email]);
$lastId = $pdo->lastInsertId();
// UPDATE
$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute([$name, $id]);
$affected = $stmt->rowCount();
// DELETE
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([$id]);
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());
}
PDO: Standard Query & While-Loop
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
- Query nur für statische SQL-Statements ohne Variablen
- Prepared Statements immer bei User-Input verwenden (SQL-Injection-Schutz!)