Start · Sprachen · PHP · Referenz · mysqli_stmt_get_warnings

mysqli_stmt_get_warnings

Funktion

Ruft nach der Ausführung eines vorbereiteten Statements die MySQL-Warnungen ab und gibt das erste <code>mysqli_warning</code>-Objekt zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_get_warnings(mysqli_stmt $statement): mysqli_warning|false

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

Typ
mysqli_warning|false
Beschreibung
Gibt ein 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();
Errno: 1265 SQLState: 01000 Message: Data truncated for column 'name' at row 1 ---

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);
Warnung: Out of range value for column 'val' at row 1

// 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.