Signatur
Beschreibung
PDO (PHP Data Objects) ist die eingebaute, treiberunabhängige Datenbank-Schnittstelle. Mit dem gleichen API-Code sprichst du MySQL, PostgreSQL, SQLite, SQL Server oder Oracle an — nur der Connection-String (DSN) unterscheidet sich.
Die wichtigsten Konfigurationsoptionen:
PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION— Fehler werfen Exceptions statt silent zu failen.PDO::ATTR_DEFAULT_FETCH_MODE = PDO::FETCH_ASSOC— assoziative Arrays statt numerisch indexierter.PDO::ATTR_EMULATE_PREPARES = false— echte Server-Side-Prepared-Statements, keine emulierten.
Prepared Statements sind der einzige richtige Weg, User-Input in SQL zu verwenden. String-Konkatenation ist eine Einladung zur SQL-Injection.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $dsn Pflicht | string | — | Data Source Name, z. B. mysql:host=127.0.0.1;dbname=app;charset=utf8mb4. |
| $username | ?string | null | Optional. Für SQLite nicht nötig. |
| $password | ?string | null | Optional. |
| $options | ?array | null | Treiber-spezifische Verbindungsoptionen. |
Rückgabewert
Beispiele
Sichere MySQL-Verbindung
<?php
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=app;charset=utf8mb4',
'root',
'',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
Prepared Statement mit Named Parameters
<?php
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE status = :status AND age >= :min');
$stmt->execute([':status' => 'active', ':min' => 18]);
foreach ($stmt->fetchAll() as $row) {
echo "{$row['id']}: {$row['name']}\n";
}
Transaktion
<?php
$pdo->beginTransaction();
try {
$pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id = ?')
->execute([100, 1]);
$pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id = ?')
->execute([100, 2]);
$pdo->commit();
} catch (\Throwable $e) {
$pdo->rollBack();
throw $e;
}
// Wichtig · Fallstricke
Kritisch: PDO::ATTR_EMULATE_PREPARES = false ist wichtig, weil emulierte Prepares String-basiert im PHP-Layer arbeiten und in Randfällen (z. B. mit dem MySQL-Charset gbk) für Injection-Lücken sorgen können.