Signatur
Beschreibung
mysqli_stmt_get_warnings() ermöglicht es, nach der Ausführung eines vorbereiteten Statements (mysqli_stmt) die vom MySQL-Server erzeugten Warnungen abzurufen – ähnlich wie das SQL-Kommando SHOW WARNINGS. Die Funktion gibt ein mysqli_warning-Objekt zurück, das die erste Warnung enthält, oder false, wenn keine Warnungen vorliegen.
Das zurückgegebene mysqli_warning-Objekt besitzt die Eigenschaften message (Warnungstext), sqlstate (SQL-Statuscode) und errno (Fehlernummer). Über die Methode next() des Objekts können weitere Warnungen – sofern vorhanden – nacheinander abgerufen werden.
Diese Funktion ist besonders nützlich, wenn Datenbankoperationen zwar erfolgreich abgeschlossen werden, aber dennoch zu Datenverlust oder unerwarteten Anpassungen führen könnten (z. B. Trunkierungen von Zeichenketten, implizite Typumwandlungen oder Wertebereichsüberschreitungen). Sie sollte immer dann eingesetzt werden, wenn die Anzahl der Warnungen (mysqli_warning_count()) größer als null ist.
Beachte, dass Warnungen nach dem Schließen des Statements oder nach dem Ausführen der nächsten Abfrage nicht mehr verfügbar sind. Sie sollten daher unmittelbar nach der Ausführung des Statements abgerufen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Statement-Objekt (mysqli_stmt), dessen Warnungen abgerufen werden sollen. |
Rückgabewert
mysqli_warning-Objekt mit der ersten Warnung zurück, oder false, wenn keine Warnungen vorhanden sind. Über ->next() können weitere Warnungen traversiert werden.Beispiele
Warnungen nach INSERT mit Datentrunkeierung auslesen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
// Tabelle mit begrenzter Spaltenbreite
$mysqli->query("CREATE TEMPORARY TABLE demo (name VARCHAR(5))");
$stmt = $mysqli->prepare("INSERT INTO demo (name) VALUES (?)");
$name = 'Alexandros'; // Länger als 5 Zeichen → Trunkierung
$stmt->bind_param('s', $name);
$stmt->execute();
if ($stmt->warning_count > 0) {
$warning = mysqli_stmt_get_warnings($stmt);
while ($warning) {
echo 'Errno: ' . $warning->errno . PHP_EOL;
echo 'SQLState: ' . $warning->sqlstate . PHP_EOL;
echo 'Message: ' . $warning->message . PHP_EOL;
echo '---' . PHP_EOL;
$warning = $warning->next();
}
}
$stmt->close();
$mysqli->close();
Prozedurale Verwendung mit mysqli_warning_count
<?php
$link = mysqli_connect('localhost', 'user', 'password', 'testdb');
mysqli_query($link, "CREATE TEMPORARY TABLE nums (val TINYINT UNSIGNED)");
$stmt = mysqli_prepare($link, "INSERT INTO nums (val) VALUES (?)");
$val = 300; // Überschreitet TINYINT UNSIGNED (max 255) → Warnung
mysqli_stmt_bind_param($stmt, 'i', $val);
mysqli_stmt_execute($stmt);
if (mysqli_warning_count($link) > 0) {
$warning = mysqli_stmt_get_warnings($stmt);
if ($warning !== false) {
echo 'Warnung: ' . $warning->message . PHP_EOL;
}
}
mysqli_stmt_close($stmt);
mysqli_close($link);
// Wichtig · Fallstricke
Warnungen sind flüchtig: MySQL stellt Warnungen nur bis zur nächsten Abfrage bereit. mysqli_stmt_get_warnings() muss daher unmittelbar nach mysqli_stmt_execute() aufgerufen werden, bevor weitere Datenbankoperationen stattfinden.
Prüfung vorab empfohlen: Vor dem Aufruf sollte immer $stmt->warning_count (OOP) bzw. mysqli_warning_count() geprüft werden, um unnötige Aufrufe zu vermeiden und sicherzustellen, dass tatsächlich Warnungen vorliegen.
Undokumentierte Funktion: mysqli_stmt_get_warnings() ist in der offiziellen PHP-Dokumentation nur rudimentär dokumentiert. Das Verhalten kann sich zwischen PHP- und MySQL-Versionen leicht unterscheiden.