Signatur
Beschreibung
mysqli_error() liefert die Fehlermeldung des letzten fehlgeschlagenen MySQL-Befehls auf der übergebenen Datenbankverbindung. Die Funktion ist das prozedurale Pendant zur objektorientierten Eigenschaft mysqli::$error.
Typischerweise wird mysqli_error() unmittelbar nach einem fehlgeschlagenen Aufruf von mysqli_query(), mysqli_prepare() oder ähnlichen Funktionen eingesetzt, um eine aussagekräftige Fehlermeldung für Debugging-Zwecke zu erhalten. Wichtig: Die Fehlermeldung bezieht sich stets auf den letzten ausgeführten Befehl – ein weiterer erfolgreicher Befehl überschreibt sie mit einer leeren Zeichenkette.
Im Produktivbetrieb sollten Fehlermeldungen niemals direkt an den Browser ausgegeben werden, da sie interne Datenbankstrukturen (Tabellennamen, Spaltennamen, Abfragelogik) preisgeben und so Angreifern wertvolle Informationen liefern können. Stattdessen empfiehlt es sich, Fehler zu loggen und dem Nutzer nur eine generische Fehlermeldung anzuzeigen.
Ab PHP 8.1 wird empfohlen, für eine automatische Fehlerbehandlung mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) zu aktivieren, damit Fehler automatisch als Ausnahmen geworfen werden und mysqli_error() nicht mehr manuell geprüft werden muss.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein mysqli-Verbindungsobjekt, das durch mysqli_connect() oder new mysqli() erzeugt wurde. |
Rückgabewert
'') zurückgegeben.Beispiele
Fehlerbehandlung nach fehlgeschlagenem Query
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'datenbank');
if (!$mysqli) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
$result = mysqli_query($mysqli, 'SELECT * FROM nicht_vorhandene_tabelle');
if (!$result) {
// Im Produktivbetrieb: Fehler loggen statt ausgeben!
error_log('Datenbankfehler: ' . mysqli_error($mysqli));
echo 'Ein Datenbankfehler ist aufgetreten. Bitte versuchen Sie es später erneut.';
} else {
// Ergebnisse verarbeiten
while ($zeile = mysqli_fetch_assoc($result)) {
echo $zeile['name'] . PHP_EOL;
}
mysqli_free_result($result);
}
mysqli_close($mysqli);
Objektorientierter Stil mit mysqli::$error
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');
if ($mysqli->connect_errno) {
die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}
// Absichtlich fehlerhafter SQL-Befehl
if (!$mysqli->query('INSERT INTO produkte (name, preis) VALUES ("Test")')) {
// OOP-Äquivalent zu mysqli_error()
error_log('SQL-Fehler (' . $mysqli->errno . '): ' . $mysqli->error);
echo 'Einfügen fehlgeschlagen.';
}
$mysqli->close();
Automatische Fehlerbehandlung mit mysqli_report (empfohlen)
<?php
// Fehler automatisch als Exception werfen – mysqli_error() wird nicht mehr benötigt
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');
$mysqli->query('SELECT * FROM nicht_vorhandene_tabelle');
} catch (mysqli_sql_exception $e) {
error_log('Datenbankfehler: ' . $e->getMessage());
echo 'Ein interner Fehler ist aufgetreten.';
}
// Wichtig · Fallstricke
Sicherheitshinweis: Geben Sie die Rückgabe von mysqli_error() niemals direkt im Browser aus. Fehlermeldungen enthalten oft Tabellennamen, Spaltennamen und SQL-Fragmente, die Angreifern bei SQL-Injection-Angriffen helfen können. Nutzen Sie stattdessen error_log() zum Protokollieren und zeigen Sie dem Nutzer nur generische Meldungen.
Reihenfolge beachten: mysqli_error() gibt stets den Fehler des letzten Datenbankbefehls zurück. Führen Sie nach einem Fehler noch weitere Befehle aus, bevor Sie mysqli_error() aufrufen, kann die ursprüngliche Fehlermeldung bereits überschrieben sein.
Moderner Ansatz: Ab PHP 8.1 wird empfohlen, mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) zu Beginn des Skripts zu setzen. Dadurch werden Fehler automatisch als mysqli_sql_exception geworfen, und manuelle Prüfungen mit mysqli_error() entfallen.