Start · Sprachen · PHP · Referenz · mysqli_warning

mysqli_warning

Klasse

Stellt eine einzelne MySQL-Warnung dar, die nach einer Datenbankoperation aufgetreten ist.

seit PHP 5.0.0 Kategorie: db

Signatur

class mysqli_warning

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();
Warnung [1264] SQLSTATE 22003: Out of range value for column 'val' at row 1

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);
Fehler 1265 (01000): Data truncated for column 'name' at row 1

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