Start · Sprachen · PHP · Referenz · mysqli_stmt_errno

mysqli_stmt_errno

Funktion

Gibt den numerischen Fehlercode der zuletzt auf einem vorbereiteten Statement ausgeführten Operation zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_errno(mysqli_stmt $statement): int

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

Typ
int
Beschreibung
Den numerischen MySQL-Fehlercode der zuletzt fehlgeschlagenen Statement-Operation, oder 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();
Fehler: Diese E-Mail-Adresse ist bereits registriert.

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();
Prepare-Fehler: Table 'testdb.nicht_existente_tabelle' doesn't exist

// 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.