Start · Sprachen · PHP · Referenz · mysqli_warning_count

mysqli_warning_count

Funktion

Liefert die Anzahl der Warnungen, die durch die zuletzt ausgeführte SQL-Abfrage auf der angegebenen Datenbankverbindung erzeugt wurden.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_warning_count(mysqli $mysql): int

Beschreibung

mysqli_warning_count() gibt die Anzahl der Warnungen zurück, die MySQL beim Ausführen der letzten Abfrage generiert hat. Warnungen entstehen typischerweise bei Datenkonvertierungen, bei zu langen Strings die abgeschnitten werden, bei NULL-Werten in NOT-NULL-Spalten oder bei impliziten Typanpassungen – also überall dort, wo MySQL eine Operation dennoch durchführt, aber eine Abweichung vom erwarteten Verhalten feststellt.

Im Gegensatz zu Fehlern brechen Warnungen die Abfrage nicht ab. Daher kann es vorkommen, dass Daten scheinbar korrekt gespeichert werden, aber stille Datenverluste oder -veränderungen auftreten. Durch das Abfragen der Warnungsanzahl nach jeder kritischen Datenbankoperation lassen sich solche stillen Fehler erkennen.

Um die genauen Warnungsdetails abzurufen, kann nach dem Feststellen einer Warnung die SQL-Abfrage SHOW WARNINGS ausgeführt werden. In der objektorientierten Schreibweise steht diese Funktion als Eigenschaft $mysqli->warning_count zur Verfügung.

Besonders nützlich ist die Funktion beim Importieren oder Migrieren großer Datenmengen sowie bei INSERT- und UPDATE-Operationen, bei denen sichergestellt werden soll, dass die übergebenen Werte exakt und ohne Anpassung gespeichert wurden.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Ein von mysqli_connect() oder mysqli_init() zurückgegebenes mysqli-Verbindungsobjekt.

Rückgabewert

Typ
int
Beschreibung
Gibt die Anzahl der Warnungen als nicht-negative Ganzzahl zurück. Wurde keine Warnung generiert, ist der Rückgabewert 0.

Beispiele

Warnungen nach einem INSERT erkennen

<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');

if (!$mysqli) {
    die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}

// Tabelle mit einer TINYINT-Spalte (Maximalwert 127)
$mysqli->query("CREATE TEMPORARY TABLE test_warn (id TINYINT NOT NULL)");

// Wert 999 überschreitet den Wertebereich von TINYINT → erzeugt eine Warnung
$mysqli->query("INSERT INTO test_warn (id) VALUES (999)");

$warnCount = mysqli_warning_count($mysqli);
echo "Anzahl der Warnungen: " . $warnCount . PHP_EOL;

if ($warnCount > 0) {
    $result = $mysqli->query("SHOW WARNINGS");
    while ($row = $result->fetch_assoc()) {
        echo "Level: {$row['Level']}, Code: {$row['Code']}, Nachricht: {$row['Message']}" . PHP_EOL;
    }
}

$mysqli->close();
?>
Anzahl der Warnungen: 1 Level: Warning, Code: 1264, Nachricht: Out of range value for column 'id' at row 1

Objektorientierte Schreibweise mit Warnstufen-Prüfung

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');

if ($mysqli->connect_errno) {
    die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}

$mysqli->query("CREATE TEMPORARY TABLE produkte (name VARCHAR(5) NOT NULL)");

// String wird auf 5 Zeichen gekürzt → erzeugt Warnung
$mysqli->query("INSERT INTO produkte (name) VALUES ('LangerProduktname')");

if ($mysqli->warning_count > 0) {
    echo "Achtung: {$mysqli->warning_count} Warnung(en) nach dem INSERT." . PHP_EOL;

    $warnings = $mysqli->query("SHOW WARNINGS");
    foreach ($warnings as $w) {
        echo "[{$w['Level']}] {$w['Message']}" . PHP_EOL;
    }
} else {
    echo "Keine Warnungen – Daten korrekt gespeichert." . PHP_EOL;
}

$mysqli->close();
?>
Achtung: 1 Warnung(en) nach dem INSERT. [Warning] Data truncated for column 'name' at row 1

// Wichtig · Fallstricke

Stille Datenverluste: Da Warnungen die Ausführung einer Abfrage nicht unterbrechen, können Daten ohne sichtbaren Fehler verändert oder abgeschnitten werden. In produktionskritischen Anwendungen sollte nach INSERT- und UPDATE-Operationen stets mysqli_warning_count() geprüft werden.

Reihenfolge beachten: Die Warnungsanzahl bezieht sich immer auf die zuletzt ausgeführte Abfrage. Ein zwischengeschaltetes SHOW WARNINGS oder eine weitere Abfrage setzt den Zähler zurück. Die Prüfung sollte daher unmittelbar nach der relevanten Abfrage erfolgen.

SQL-Modus: Mit dem MySQL-SQL-Modus STRICT_ALL_TABLES oder STRICT_TRANS_TABLES werden viele Situationen, die sonst Warnungen erzeugen, zu echten Fehlern umgewandelt. Das erhöht die Datensicherheit und ist in der Regel zu bevorzugen.