Signatur
Beschreibung
mysqli_stmt_errno() liefert den MySQL-Fehlercode (als positive Ganzzahl) der zuletzt fehlgeschlagenen Operation auf dem übergebenen mysqli_stmt-Objekt. Wenn kein Fehler aufgetreten ist, wird 0 zurückgegeben.
Die Funktion ist besonders nützlich im Fehlerbehandlungs-Code nach mysqli_stmt_execute(), mysqli_stmt_fetch() oder mysqli_stmt_bind_param(), um zwischen verschiedenen MySQL-Fehlerzuständen zu unterscheiden – beispielsweise zwischen einem Duplikat-Fehler (1062) und einem allgemeinen Fehler. In Kombination mit mysqli_stmt_error() (Fehlermeldungstext) und mysqli_stmt_sqlstate() (SQLSTATE-Code) lässt sich eine vollständige Fehlerdiagnose umsetzen.
Im objektorientierten Stil steht die Eigenschaft $stmt->errno zur Verfügung, die denselben Wert liefert. Beide Varianten sind gleichwertig und können nach Belieben eingesetzt werden.
Wichtig: Der Fehlercode bezieht sich ausschließlich auf das angegebene Statement-Handle. Verbindungsfehler, die vor der Erstellung des Statements auftreten, müssen über mysqli_errno() abgefragt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Ein gültiges mysqli_stmt-Objekt, das zuvor mit mysqli_prepare() oder mysqli_stmt_init() erzeugt wurde. |
Rückgabewert
0, wenn kein Fehler aufgetreten ist.Beispiele
Fehlerbehandlung nach mysqli_stmt_execute()
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('INSERT INTO users (email) VALUES (?)');
$stmt->bind_param('s', $email);
$email = 'bereits@vorhanden.de'; // Angenommen, diese E-Mail existiert bereits (UNIQUE-Constraint)
if (!$stmt->execute()) {
$errorCode = mysqli_stmt_errno($stmt);
$errorMsg = mysqli_stmt_error($stmt);
if ($errorCode === 1062) {
echo "Fehler: Diese E-Mail-Adresse ist bereits registriert.\n";
} else {
echo "Datenbankfehler [{$errorCode}]: {$errorMsg}\n";
}
} else {
echo "Eintrag erfolgreich gespeichert.\n";
}
$stmt->close();
$mysqli->close();
Verwendung im objektorientierten Stil über $stmt->errno
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$stmt = $mysqli->prepare('SELECT * FROM nicht_existente_tabelle WHERE id = ?');
if (!$stmt) {
// Fehler beim Vorbereiten – noch kein stmt-Objekt vorhanden
echo 'Prepare-Fehler: ' . $mysqli->error . PHP_EOL;
} else {
$id = 1;
$stmt->bind_param('i', $id);
$stmt->execute();
if ($stmt->errno !== 0) {
// Äquivalent zu mysqli_stmt_errno($stmt)
printf(
"Statement-Fehler %d (SQLSTATE %s): %s\n",
$stmt->errno,
$stmt->sqlstate,
$stmt->error
);
}
$stmt->close();
}
$mysqli->close();
// Wichtig · Fallstricke
Hinweis zur Fehlerquelle: mysqli_stmt_errno() gibt nur Fehler zurück, die direkt auf dem Statement-Handle aufgetreten sind. Fehler, die beim Aufbau der Verbindung oder außerhalb eines Statements entstehen, müssen mit mysqli_errno() abgefragt werden.
Fehlerbehandlung nicht vergessen: Im Produktionsbetrieb sollten Fehlermeldungen und -codes nie ungeprüft an den Endnutzer ausgegeben werden, da sie interne Datenbankstrukturen offenbaren können. Loggen Sie Fehler serverseitig und zeigen Sie Benutzern nur generische Fehlermeldungen.
Ausnahmen aktivieren: Ab PHP 8.1 wird empfohlen, den MySQL-Report-Modus auf Exceptions umzustellen (mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)), sodass Fehler automatisch als mysqli_sql_exception geworfen werden und manuelles Prüfen via mysqli_stmt_errno() seltener nötig ist.