Start · Sprachen · PHP · Referenz · PDO

PDO

Klasse

PHP Data Objects — die native, datenbank-agnostische Abstraktionsschicht. Prepared Statements sind Pflicht.

seit PHP 5.1.0 Kategorie: db

Signatur

class PDO

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

Typ
PDO
Beschreibung
Aktive Datenbankverbindung.

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.

Siehe auch