Signatur
Beschreibung
Die Klasse mysqli_warning repräsentiert eine einzelne Warnung, die MySQL im Rahmen einer Datenbankoperation erzeugt hat. Solche Warnungen entstehen z. B. bei impliziten Typkonvertierungen, abgeschnittenen Werten oder anderen nicht-fatalen Problemen, die keine Exception auslösen, aber dennoch auf Datenverlust oder unerwartetes Verhalten hinweisen können.
Instanzen dieser Klasse werden nicht direkt instanziiert, sondern über die Methode mysqli::get_warnings() (OOP) bzw. mysqli_get_warnings() (prozedural) abgerufen. Das zurückgegebene Objekt ermöglicht es, durch alle aufgetretenen Warnungen zu iterieren, indem die Methode next() aufgerufen wird.
Jede Instanz besitzt drei öffentliche Eigenschaften: message enthält den menschenlesbaren Warnungstext, sqlstate den fünfstelligen SQLSTATE-Code und errno die numerische MySQL-Fehlernummer. Diese Informationen entsprechen dem, was SHOW WARNINGS in MySQL liefert.
Der Einsatz von mysqli_warning ist besonders dann sinnvoll, wenn eine Anwendung sicherstellen muss, dass keine stillen Datenverluste oder -verfälschungen auftreten – etwa beim Einfügen von Werten, die der MySQL-Server automatisch anpasst.
Beispiele
Warnungen nach einem INSERT auslesen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Eine Tabelle mit einem TINYINT-Feld (max. 127)
$mysqli->query("CREATE TEMPORARY TABLE t (val TINYINT NOT NULL)");
// Wert 300 überschreitet TINYINT-Bereich → MySQL erzeugt eine Warnung
$mysqli->query("INSERT INTO t (val) VALUES (300)");
if ($mysqli->warning_count > 0) {
$warning = $mysqli->get_warnings();
do {
echo 'Warnung [' . $warning->errno . '] SQLSTATE ' . $warning->sqlstate . ': ' . $warning->message . PHP_EOL;
} while ($warning->next());
}
$mysqli->close();
Warnungen prozedural verarbeiten
<?php
$link = mysqli_connect('localhost', 'user', 'password', 'testdb');
mysqli_query($link, "CREATE TEMPORARY TABLE t2 (name VARCHAR(5) NOT NULL)");
// Wert wird auf 5 Zeichen abgeschnitten
mysqli_query($link, "INSERT INTO t2 (name) VALUES ('Alexandros')");
if (mysqli_warning_count($link) > 0) {
$warning = mysqli_get_warnings($link);
do {
printf(
"Fehler %d (%s): %s\n",
$warning->errno,
$warning->sqlstate,
$warning->message
);
} while ($warning->next());
}
mysqli_close($link);
// Wichtig · Fallstricke
Kein direkter Konstruktor: mysqli_warning kann nicht mit new mysqli_warning() instanziiert werden. Instanzen werden ausschließlich über mysqli::get_warnings() bzw. mysqli_get_warnings() erzeugt.
Warnungen vs. Fehler: MySQL-Warnungen führen weder zu einer PHP-Exception noch zu einem Rückgabewert false. Sie werden stillschweigend ignoriert, wenn die Anwendung warning_count nicht prüft. Besonders in Produktivsystemen sollten Warnungen protokolliert werden, da sie auf stille Datenverluste hinweisen können.
SQL-Strict-Modus: Im MySQL-Strict-Mode (STRICT_TRANS_TABLES oder STRICT_ALL_TABLES) werden viele Situationen, die normalerweise Warnungen erzeugen, stattdessen als Fehler behandelt. Das Verhalten von mysqli_warning kann also je nach Serverkonfiguration variieren.