Start · Sprachen · PHP · Referenz · Pdo\Mysql

Pdo\Mysql

Klasse

Erweitert <code>PDO</code> um einen dedizierten SQL-Parser für den MySQL-Dialekt und bietet MySQL-spezifische Funktionalitäten.

seit PHP 8.4.0 Kategorie: db

Signatur

class Pdo\Mysql extends PDO

Beschreibung

Pdo\Mysql ist eine in PHP 8.4 eingeführte, spezialisierte Unterklasse von PDO, die einen eigenen SQL-Parser für den MySQL-Dialekt mitbringt. Damit können MySQL-spezifische Syntaxelemente – wie etwa LOAD DATA INFILE, mehrzeilige Kommentare oder benutzerdefinierte Variablen – korrekt verarbeitet werden, ohne dass der generische PDO-Parser Probleme verursacht.

Der dedizierte Parser versteht die Eigenheiten von MySQL und MariaDB vollständig. So werden etwa Named- und Positional-Platzhalter (:name bzw. ?) zuverlässig erkannt, auch wenn sie in MySQL-spezifischen Konstrukten eingebettet sind. Das erhöht die Robustheit von Prepared Statements erheblich.

Die Klasse wird über den DSN-Bezeichner mysql: instanziiert – genau wie die klassische PDO-Verbindung zu MySQL. Bestehender Code, der new PDO('mysql:...') nutzt, kann direkt auf new Pdo\Mysql('mysql:...') umgestellt werden, da die geerbte API vollständig kompatibel ist. Zusätzlich stellt Pdo\Mysql MySQL-spezifische Attribute und Konstanten bereit.

Sinnvoll ist der Einsatz überall dort, wo gezielt mit MySQL oder MariaDB gearbeitet wird und die erhöhte Dialekt-Kompatibilität sowie die stabilen Prepared-Statement-Funktionen genutzt werden sollen – insbesondere in Projekten, die komplexe oder ungewöhnliche MySQL-Syntax verwenden.

Parameter

Name Typ Default Beschreibung
$dsn Pflicht string Der Data Source Name, z. B. mysql:host=localhost;dbname=testdb;charset=utf8mb4.
$username string|null null Der Benutzername für die Datenbankverbindung.
$password string|null null Das Passwort für die Datenbankverbindung.
$options array|null null Ein optionales Array mit treiberspezifischen Verbindungsoptionen, z. B. [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION].

Beispiele

Verbindung zu MySQL mit Pdo\Mysql herstellen

<?php
$dsn = 'mysql:host=127.0.0.1;dbname=shop;charset=utf8mb4';
$username = 'shopuser';
$password = 'geheimesPasswort';

try {
    $pdo = new Pdo\Mysql($dsn, $username, $password, [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ]);

    $stmt = $pdo->prepare('SELECT id, name, price FROM products WHERE category = :category');
    $stmt->execute([':category' => 'electronics']);

    foreach ($stmt->fetchAll() as $row) {
        echo $row['name'] . ' – ' . number_format($row['price'], 2) . ' EUR' . PHP_EOL;
    }
} catch (PDOException $e) {
    echo 'Verbindungsfehler: ' . $e->getMessage();
}
Laptop Pro – 1299.99 EUR Smartphone X – 799.00 EUR

MySQL-spezifische Variable mit dediziertem Parser nutzen

<?php
$pdo = new Pdo\Mysql(
    'mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4',
    'root',
    '',
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

// MySQL-Benutzervariable @rownum – der dedizierte Parser erkennt @-Syntax korrekt
$sql = 'SELECT @rownum := @rownum + 1 AS rownum, name
        FROM users, (SELECT @rownum := 0) AS init
        ORDER BY name
        LIMIT 5';

$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['rownum'] . '. ' . $row['name'] . PHP_EOL;
}
1. Anna 2. Ben 3. Clara 4. David 5. Eva

// Wichtig · Fallstricke

Sicherheit: Verwende grundsätzlich Prepared Statements mit gebundenen Parametern und setze PDO::ATTR_EMULATE_PREPARES auf false, damit echte serverseitige Prepared Statements genutzt werden. So wird SQL-Injection zuverlässig verhindert.

Neu in PHP 8.4: Die Klasse Pdo\Mysql ist seit PHP 8.4 verfügbar und ersetzt intern die zuvor verwendete generische PDO-Implementierung für den MySQL-Treiber. Ältere Projekte, die new PDO('mysql:...') schreiben, erhalten hinter den Kulissen ab PHP 8.4 ebenfalls eine Instanz dieser Klasse.

MariaDB: Für MariaDB-Verbindungen steht die separate Klasse Pdo\Dblib bzw. der spezialisierte Pdo\Mysqlnd-Treiber zur Verfügung; Pdo\Mysql funktioniert aber auch mit MariaDB-Servern über den mysql:-DSN.

Zeichensatz: Immer charset=utf8mb4 im DSN angeben, um Encoding-Probleme und potenzielle Sicherheitslücken durch falsche Zeichensatz-Konvertierungen zu vermeiden.