Start · Sprachen · PHP · Referenz · mysqli_sql_exception

mysqli_sql_exception

Klasse

Ausnahme-Klasse für MySQLi-Fehler, die bei aktiviertem Exception-Modus automatisch geworfen wird.

seit PHP 5.0.0 Kategorie: db

Signatur

class mysqli_sql_exception extends RuntimeException

Beschreibung

mysqli_sql_exception ist die spezialisierte Ausnahme-Klasse der MySQLi-Erweiterung und erweitert RuntimeException. Sie wird automatisch geworfen, wenn MySQLi im Exception-Modus betrieben wird – also wenn der Fehlerbehandlungsmodus auf MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT gesetzt wurde.

Die Klasse erweitert RuntimeException um zwei MySQLi-spezifische Eigenschaften: den SQLSTATE-Fehlercode (abrufbar über getSqlState()) sowie den numerischen MySQL-Fehlercode (über getCode()). Die übliche Fehlermeldung des Datenbankservers ist über getMessage() verfügbar. Damit stehen alle relevanten Fehlerinformationen einer MySQL-Aktion innerhalb des catch-Blocks zur Verfügung.

Der Einsatz dieser Klasse empfiehlt sich in modernen Anwendungen als Alternative zur manuellen Fehlerprüfung nach jedem Datenbankaufruf. Durch die Nutzung von try/catch-Blöcken lässt sich der Code erheblich übersichtlicher gestalten und es können zentrale Fehlerbehandlungsroutinen genutzt werden.

Wichtig: Damit mysqli_sql_exception automatisch geworfen wird, muss vorher mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) aufgerufen werden. Ohne diese Einstellung werden Fehler nur als Warnungen ausgegeben oder müssen manuell geprüft werden.

Beispiele

Verbindungsfehler mit mysqli_sql_exception abfangen

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $mysqli = new mysqli('localhost', 'benutzer', 'falsches_passwort', 'datenbank');
} catch (mysqli_sql_exception $e) {
    echo 'MySQL-Fehlercode: ' . $e->getCode() . PHP_EOL;
    echo 'SQLSTATE: ' . $e->getSqlState() . PHP_EOL;
    echo 'Fehlermeldung: ' . $e->getMessage() . PHP_EOL;
}
MySQL-Fehlercode: 1045 SQLSTATE: 28000 Fehlermeldung: Access denied for user 'benutzer'@'localhost' (using password: YES)

Abfragefehler bei ungültigem SQL abfangen

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');

    // Absichtlich fehlerhafte Abfrage
    $mysqli->query('SELECT * FROM nicht_existente_tabelle');
} catch (mysqli_sql_exception $e) {
    echo 'Datenbankfehler aufgetreten!' . PHP_EOL;
    echo 'Fehlercode: ' . $e->getCode() . PHP_EOL;
    echo 'SQLSTATE: ' . $e->getSqlState() . PHP_EOL;
    echo 'Details: ' . $e->getMessage() . PHP_EOL;

    // Fehler loggen, ohne sensible Details an den Benutzer auszugeben
    error_log($e->getMessage());
}
Datenbankfehler aufgetreten! Fehlercode: 1146 SQLSTATE: 42S02 Details: Table 'datenbank.nicht_existente_tabelle' doesn't exist

// Wichtig · Fallstricke

Sicherheitshinweis: Fehlermeldungen von mysqli_sql_exception können sensible Informationen über die Datenbankstruktur, Tabellennamen oder interne Logik enthalten. Diese Meldungen sollten niemals ungefiltert an den Endbenutzer ausgegeben werden. Stattdessen empfiehlt es sich, sie zu loggen (z. B. mit error_log()) und dem Benutzer nur eine allgemeine Fehlermeldung anzuzeigen.

Ohne vorherigen Aufruf von mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) wird mysqli_sql_exception nicht automatisch geworfen. Der Exception-Modus muss also explizit aktiviert werden, idealerweise direkt zu Beginn der Anwendung.

Da mysqli_sql_exception RuntimeException erweitert, kann sie auch mit einem catch (RuntimeException $e)- oder catch (Exception $e)-Block abgefangen werden. Für eine präzise Fehlerbehandlung ist jedoch das direkte Abfangen von mysqli_sql_exception empfehlenswert.