Signatur
Beschreibung
mysqli_get_warnings() ruft die Warnungen ab, die der MySQL-Server nach der Ausführung des letzten SQL-Statements erzeugt hat. Die Funktion gibt ein mysqli_warning-Objekt zurück, über das die erste Warnung direkt zugänglich ist. Weitere Warnungen können über die Methode next() dieses Objekts iteriert werden.
Warnungen entstehen z. B. bei impliziten Typkonvertierungen, beim Abschneiden von zu langen Werten, bei NOT-NULL-Verletzungen mit Standardwert-Fallback oder beim Einfügen von Daten in Spalten mit falschen Datenbereichen. Im Gegensatz zu Fehlern brechen Warnungen die Ausführung nicht ab, sollten aber dennoch überprüft werden, um Datenverlust oder unerwartetes Verhalten zu erkennen.
Die Anzahl der Warnungen für das letzte Statement ist über das Attribut $mysqli->warning_count abrufbar. mysqli_get_warnings() ist sinnvoll, wenn mehr als null Warnungen vorliegen und Details zu deren Typ, Code und Nachricht benötigt werden.
In der objektorientierten Schreibweise steht die Methode $mysqli->get_warnings() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive mysqli-Verbindungsinstanz, die mit mysqli_connect() oder new mysqli() erstellt wurde. |
Rückgabewert
mysqli_warning-Objekt zurück, wenn Warnungen vorhanden sind. Das Objekt besitzt die Eigenschaften message (Warnungstext), sqlstate (SQLSTATE-Code) und errno (Fehlercode). Mit der Methode next() kann zur nächsten Warnung gewechselt werden. Gibt false zurück, wenn keine Warnungen vorliegen.Beispiele
Warnungen nach einem INSERT mit zu langem Wert abfragen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_error) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Tabelle mit begrenzter VARCHAR-Länge
$mysqli->query("CREATE TEMPORARY TABLE kurz (name VARCHAR(5))");
// Zu langer Wert — erzeugt eine Warnung
$mysqli->query("INSERT INTO kurz (name) VALUES ('Superlanger Wert')");
if ($mysqli->warning_count > 0) {
$warnung = $mysqli->get_warnings();
do {
echo 'Code: ' . $warnung->errno . PHP_EOL;
echo 'SQLSTATE: ' . $warnung->sqlstate . PHP_EOL;
echo 'Meldung: ' . $warnung->message . PHP_EOL;
echo '---' . PHP_EOL;
} while ($warnung->next());
} else {
echo 'Keine Warnungen.';
}
$mysqli->close();
Prozeduraler Stil mit mysqli_get_warnings
<?php
$link = mysqli_connect('localhost', 'user', 'password', 'testdb');
if (!$link) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
mysqli_query($link, "CREATE TEMPORARY TABLE zahlen (wert TINYINT)");
// 300 liegt außerhalb des TINYINT-Bereichs — erzeugt Warnung
mysqli_query($link, "INSERT INTO zahlen (wert) VALUES (300)");
$anzahl = mysqli_warning_count($link);
echo 'Anzahl Warnungen: ' . $anzahl . PHP_EOL;
if ($anzahl > 0) {
$warnung = mysqli_get_warnings($link);
do {
echo 'Warnung [' . $warnung->errno . ']: ' . $warnung->message . PHP_EOL;
} while ($warnung->next());
}
mysqli_close($link);
// Wichtig · Fallstricke
Wichtig: mysqli_get_warnings() muss unmittelbar nach dem relevanten SQL-Statement aufgerufen werden, da ein neues Statement die Warnungen des vorherigen überschreibt.
Warnungen sind kein Ersatz für eine ordentliche Eingabevalidierung. Tritt z. B. ein stiller Datenverlust durch Werteabschneidung auf (SQLSTATE 01000, Errno 1265), sollte die Anwendungslogik Eingaben bereits vor dem Datenbankzugriff prüfen.
Die Klasse mysqli_warning verfügt über keine öffentliche Konstruktormethode und kann nur über mysqli_get_warnings() instanziiert werden. Das Iterieren über next() gibt true zurück, solange weitere Warnungen vorhanden sind, andernfalls false.