Start · Sprachen · PHP · Referenz · mysqli_report

mysqli_report

Funktion

Legt den Modus für die mysqli-Fehlermeldungen fest und steuert, ob Fehler als Ausnahmen, Warnungen oder still behandelt werden.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_report(int $flags): bool

Beschreibung

mysqli_report() konfiguriert das Fehlerberichtssystem der mysqli-Erweiterung. Damit lässt sich bestimmen, ob mysqli-Fehler (z. B. fehlgeschlagene Abfragen oder Verbindungsprobleme) als PHP-Warnungen ausgegeben, als mysqli_sql_exception-Ausnahmen geworfen oder vollständig unterdrückt werden.

Seit PHP 8.1.0 ist der Standardmodus MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT, d. h. Fehler werden standardmäßig als Ausnahmen geworfen. In früheren Versionen war der Standard MYSQLI_REPORT_OFF, was dazu führte, dass Fehler leicht übersehen wurden. Die explizite Verwendung von mysqli_report() am Anfang eines Skripts wird daher dringend empfohlen.

Die Funktion kann entweder als prozedurale Funktion oder über die OOP-Methode mysqli_driver::$report_mode verwendet werden. Am häufigsten wird MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT eingesetzt, um Datenbankfehler sofort als Ausnahmen sichtbar zu machen und sie zentral mit try/catch abzufangen.

Mögliche Flag-Werte können mit dem bitweisen ODER-Operator (|) kombiniert werden: MYSQLI_REPORT_OFF (alles aus), MYSQLI_REPORT_ERROR (Fehler melden), MYSQLI_REPORT_STRICT (Ausnahmen statt Warnungen), MYSQLI_REPORT_INDEX (Index-Probleme melden), MYSQLI_REPORT_ALL (alles melden).

Parameter

Name Typ Default Beschreibung
$flags Pflicht int Bitmaske aus Konstanten, die den Meldemodus festlegen. Gültige Werte: MYSQLI_REPORT_OFF, MYSQLI_REPORT_ERROR, MYSQLI_REPORT_STRICT, MYSQLI_REPORT_INDEX, MYSQLI_REPORT_ALL. Mehrere Werte werden mit | kombiniert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Bei ungültigen Flags kann eine Warnung ausgelöst werden.

Beispiele

Ausnahmen für alle mysqli-Fehler aktivieren

<?php
// Empfohlene Einstellung: Fehler als Ausnahmen werfen
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $mysqli = new mysqli('localhost', 'benutzer', 'falsches_passwort', 'datenbank');
    // Wird nicht erreicht, wenn die Verbindung fehlschlägt
} catch (mysqli_sql_exception $e) {
    echo 'Datenbankfehler: ' . $e->getMessage();
}
Datenbankfehler: Access denied for user 'benutzer'@'localhost' (using password: YES)

Fehlermeldungen deaktivieren (Legacy-Modus)

<?php
// Alle mysqli-Fehlermeldungen unterdrücken (nicht empfohlen)
mysqli_report(MYSQLI_REPORT_OFF);

$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');

if ($mysqli->connect_errno) {
    // Fehler muss manuell geprüft werden
    echo 'Verbindung fehlgeschlagen: ' . $mysqli->connect_error;
}

Alle Probleme inklusive Index-Warnungen melden

<?php
// Entwicklungsmodus: Alle Probleme melden
mysqli_report(MYSQLI_REPORT_ALL);

$mysqli = new mysqli('localhost', 'root', '', 'testdb');

// Abfrage ohne Index-Nutzung wird ebenfalls gemeldet
$result = $mysqli->query('SELECT * FROM große_tabelle WHERE nicht_indizierte_spalte = 42');

// Wichtig · Fallstricke

Sicherheitshinweis: Im Produktivbetrieb sollten Fehlermeldungen niemals direkt an den Browser ausgegeben werden, da sie Datenbankstruktur und Zugangsdaten preisgeben können. Fange mysqli_sql_exception stets ab, logge den Fehler intern und zeige dem Nutzer nur eine generische Fehlermeldung.

Versionshinweis: Ab PHP 8.1.0 ist MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT der Standardwert. Wer MYSQLI_REPORT_OFF benötigt (z. B. für Legacy-Code), muss dies explizit setzen.

OOP-Äquivalent: Der Modus kann auch über $driver = new mysqli_driver(); $driver->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT; gesetzt werden.