Signatur
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();
}
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;
}
// 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.