Signatur
Beschreibung
mysqli_sqlstate() liefert den standardisierten SQLSTATE-Fehlercode der zuletzt ausgeführten MySQL-Datenbankoperation. SQLSTATE-Codes sind fünfstellige alphanumerische Zeichenketten, die dem ANSI SQL- und ODBC-Standard entsprechen und damit portabler als die MySQL-spezifischen Fehlernummern sind.
Ein Rückgabewert von '00000' bedeutet, dass kein Fehler aufgetreten ist. Codes, die mit '01' beginnen, stehen für Warnungen, alle anderen Präfixe weisen auf konkrete Fehler hin. Typische Fehler-Codes sind z. B. '42S02' (Tabelle nicht gefunden) oder '23000' (Verletzung einer Integritätsbedingung).
Die Funktion wird typischerweise im Fehler-Handling nach einem fehlgeschlagenen mysqli_query(), mysqli_prepare() oder ähnlichen Datenbankoperationen eingesetzt, um eine datenbankherstellerunabhängige Fehlerbehandlung zu implementieren. Sie ist das prozedurale Äquivalent zur Eigenschaft mysqli::$sqlstate.
SQLSTATE-Codes sind besonders nützlich, wenn Anwendungen mit mehreren Datenbanktypen kompatibel sein sollen, da dieselben Codes auch von anderen Datenbanksystemen wie PostgreSQL oder Oracle verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Verbindungsobjekt. |
Rückgabewert
'00000' zeigt an, dass kein Fehler vorliegt. Der Code besteht aus einer zweistelligen Klasse und einem dreistelligen Untercode gemäß dem ANSI SQL-Standard.Beispiele
SQLSTATE-Code nach fehlgeschlagenem Query auswerten
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
// Absichtlich eine nicht existierende Tabelle abfragen
$result = mysqli_query($mysqli, 'SELECT * FROM nicht_vorhandene_tabelle');
if (!$result) {
$sqlstate = mysqli_sqlstate($mysqli);
$errno = mysqli_errno($mysqli);
$error = mysqli_error($mysqli);
echo "SQLSTATE: $sqlstate" . PHP_EOL;
echo "Fehlernummer: $errno" . PHP_EOL;
echo "Fehlermeldung: $error" . PHP_EOL;
// Portabler Fehler-Handler basierend auf SQLSTATE
if ($sqlstate === '42S02') {
echo 'Fehlerbehandlung: Tabelle existiert nicht.' . PHP_EOL;
}
}
mysqli_close($mysqli);
Integritätsverletzung erkennen (Duplikat-Eintrag)
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
// Tabelle mit UNIQUE-Constraint anlegen (Beispiel)
mysqli_query($mysqli, 'CREATE TABLE IF NOT EXISTS benutzer (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL
)');
// Ersten Datensatz einfügen
mysqli_query($mysqli, "INSERT INTO benutzer (email) VALUES ('test@example.com')");
// Duplikat einfügen – wird fehlschlagen
$result = mysqli_query($mysqli, "INSERT INTO benutzer (email) VALUES ('test@example.com')");
if (!$result) {
$sqlstate = mysqli_sqlstate($mysqli);
echo "SQLSTATE: $sqlstate" . PHP_EOL;
if ($sqlstate === '23000') {
echo 'Diese E-Mail-Adresse ist bereits registriert.' . PHP_EOL;
}
}
mysqli_close($mysqli);
// Wichtig · Fallstricke
Wichtig: mysqli_sqlstate() gibt immer den SQLSTATE-Code der letzten Operation auf der jeweiligen Verbindung zurück. Bei mehreren aufeinanderfolgenden Datenbankoperationen muss der Code unmittelbar nach der relevanten Operation abgerufen werden, da er sonst überschrieben wird.
Nicht alle MySQL-spezifischen Fehlernummern besitzen eine eindeutige SQLSTATE-Entsprechung. In solchen Fällen gibt MySQL den generischen Code 'HY000' (allgemeiner Fehler) zurück. Für detailliertere Fehlerinformationen sollten mysqli_errno() und mysqli_error() ergänzend verwendet werden.
Das objektorientierte Äquivalent ist die Eigenschaft $mysqli->sqlstate.