Start · Sprachen · PHP · Referenz · mysqli_stmt_sqlstate

mysqli_stmt_sqlstate

Funktion

Gibt den SQLSTATE-Fehlercode der zuletzt ausgeführten Prepared-Statement-Operation zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_sqlstate(mysqli_stmt $statement): string

Beschreibung

mysqli_stmt_sqlstate() liefert einen fünfstelligen SQLSTATE-Code als Zeichenkette, der den Fehlerstatus der zuletzt an einem mysqli_stmt-Objekt ausgeführten Operation beschreibt. SQLSTATE-Codes sind im ANSI-SQL- und ODBC-Standard definiert und ermöglichen eine datenbankherstellerunabhängige Fehlerauswertung.

Ein Rückgabewert von '00000' bedeutet, dass kein Fehler aufgetreten ist. Begann der Code mit '01', handelt es sich um eine Warnung. Alle anderen Werte weisen auf einen echten Fehler hin. Im Gegensatz zum MySQL-spezifischen Fehlercode (vgl. mysqli_stmt_errno()) erlaubt der SQLSTATE-Code eine portablere Fehlerbehandlung.

Die Funktion ist besonders nützlich, wenn derselbe Fehlerbehandlungscode für mehrere Datenbanksysteme verwendet werden soll oder wenn Fehlerklassen (z. B. Constraint-Verletzungen mit '23000') erkannt werden sollen, ohne auf herstellerspezifische Fehlernummern zu prüfen.

In der objektorientierten Variante steht das Ergebnis über die Eigenschaft $stmt->sqlstate zur Verfügung.

Parameter

Name Typ Default Beschreibung
$statement Pflicht mysqli_stmt Ein mysqli_stmt-Objekt, das durch mysqli_prepare() oder mysqli::prepare() erzeugt wurde.

Rückgabewert

Typ
string
Beschreibung
Gibt einen fünfstelligen SQLSTATE-Code als Zeichenkette zurück. '00000' bedeutet kein Fehler. Bei einem Fehler enthält der Rückgabewert den entsprechenden SQLSTATE-Code (z. B. '23000' für eine Integritätsverletzung). Die Funktion gibt immer einen String zurück, niemals false oder null.

Beispiele

SQLSTATE-Code nach fehlerhafter Ausführung auswerten

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_errno) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

// Tabelle mit UNIQUE-Constraint anlegen (falls nicht vorhanden)
$mysqli->query('CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) UNIQUE NOT NULL)');

// Ersten Datensatz einfügen
$stmt = $mysqli->prepare('INSERT INTO users (email) VALUES (?)');
$stmt->bind_param('s', $email);
$email = 'test@example.com';
$stmt->execute();

// Duplikat einfügen → Constraint-Verletzung
$stmt->execute();

$sqlstate = mysqli_stmt_sqlstate($stmt);
echo 'SQLSTATE: ' . $sqlstate . PHP_EOL;

if ($sqlstate === '23000') {
    echo 'Fehler: Doppelter Eintrag – E-Mail-Adresse bereits vorhanden.' . PHP_EOL;
}

$stmt->close();
$mysqli->close();
SQLSTATE: 23000 Fehler: Doppelter Eintrag – E-Mail-Adresse bereits vorhanden.

Objektorientierte Schreibweise mit allgemeiner Fehlerklassenerkennung

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

$stmt = $mysqli->prepare('SELECT * FROM nicht_vorhandene_tabelle WHERE id = ?');

if (!$stmt) {
    // prepare() selbst ist fehlgeschlagen – SQLSTATE über mysqli-Objekt
    echo 'Prepare-Fehler SQLSTATE: ' . $mysqli->sqlstate . PHP_EOL;
} else {
    $id = 1;
    $stmt->bind_param('i', $id);
    $stmt->execute();

    $sqlstate = $stmt->sqlstate;
    echo 'SQLSTATE nach execute(): ' . $sqlstate . PHP_EOL;

    // Einfache Klassenerkennung anhand des ersten Zeichens
    $klasse = substr($sqlstate, 0, 2);
    match ($klasse) {
        '00' => print('Kein Fehler.' . PHP_EOL),
        '01' => print('Warnung aufgetreten.' . PHP_EOL),
        default => print('Fehler der Klasse ' . $klasse . ' aufgetreten.' . PHP_EOL),
    };

    $stmt->close();
}

$mysqli->close();
Prepare-Fehler SQLSTATE: 42S02

// Wichtig · Fallstricke

Hinweis zur Verfügbarkeit: Nicht alle MySQL-Fehlersituationen werden auf einen standardisierten SQLSTATE-Code abgebildet. In solchen Fällen gibt MySQL den generischen Code 'HY000' zurück. Für detaillierte Fehlermeldungen sollte zusätzlich mysqli_stmt_error() bzw. mysqli_stmt_errno() ausgewertet werden.

Prepare-Fehler: Schlägt mysqli_prepare() fehl, steht kein mysqli_stmt-Objekt zur Verfügung. In diesem Fall muss der SQLSTATE-Code über mysqli_sqlstate() am Verbindungs-Objekt abgefragt werden.

Objektorientierte Alternative: Statt der prozeduralen Funktion kann die Eigenschaft $stmt->sqlstate verwendet werden – beide Varianten liefern identische Ergebnisse.