Aktueller Standort: Startseite> Neueste Artikel> Mysqli :: get_warnings Die richtige Art und Weise, mit MySQLI :: Query zu verwenden

Mysqli :: get_warnings Die richtige Art und Weise, mit MySQLI :: Query zu verwenden

gitbox 2025-06-04

Bei der Verwendung von PHP -Erweiterung von PHP für Datenbankvorgänge achten wir normalerweise darauf, ob die Abfrage erfolgreich ist und ob ein Fehler geworfen wurde. Es gibt jedoch eine Situation, die oft ignoriert wird:. Wenn diese Warnungen nicht ausdrücklich behandelt werden, können sie potenzielle Probleme wie Exkursionen, Standardwerte ersetzt usw. Mit diesem Artikel können Sie MySQLI :: Query () und MySQLI :: get_warnings () in Kombination verwenden, um diese Warnungen zu erfassen und Best Practices zu geben.

Warum müssen Sie SQL -Warnungen folgen?

Betrachten Sie einen solchen SQL:

 $sql = "INSERT INTO users (username, email) VALUES ('this_is_a_very_long_username_that_will_be_truncated', '[email protected]')";

Unter der Annahme, dass die maximale Länge des Benutzernamenfelds 30 Zeichen beträgt, wird die tatsächliche Ausführung der oben genannten SQL abgeschnitten. Obwohl kein Fehler geworfen wird, wird eine Warnung erzeugt. Wenn wir es ignorieren, werden die Daten leise "verarbeitet", ohne dass Sie es wissen.

Was macht MySQLI :: get_warnings?

Mysqli :: get_warnings () ist eine Methode, mit der SQL -Warninformationen aus dem vorherigen Operation erhalten werden. Es gibt ein Objekt zurück, das Warnstufen, Code und Nachrichten enthält, die zum Debuggen oder Protokollieren verwendet werden können.

Tatsächliche Verwendung Beispiele

Schauen wir uns zunächst ein minimales Beispiel an, um die Grundnutzung zu verstehen:

 <?php

$mysqli = new mysqli("localhost", "user", "password", "test");

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

$sql = "INSERT INTO demo (name) VALUES ('Extra-Long-Saitenlöser-Warnwarnung extra lang')";

if ($mysqli->query($sql)) {
    echo "Erfolgreich einfügen\n";

    // Überprüfen Sie Warnungen
    $warning = $mysqli->get_warnings();
    while ($warning) {
        echo "warnen: [{$warning->errno}] {$warning->message}\n";
        $warning = $warning->next();
    }

} else {
    echo "Abfrage fehlgeschlagen: " . $mysqli->error;
}

$mysqli->close();

Praktische Vorschläge: Protokollwarnungen

In tatsächlichen Projekten wird nicht empfohlen, Warnungen direkt an den Benutzer auszugeben, sondern sie im Protokoll zu protokollieren. Zum Beispiel:

 function log_warnings($mysqli) {
    $warning = $mysqli->get_warnings();
    while ($warning) {
        error_log("SQL Warning [{$warning->errno}]: {$warning->message}");
        $warning = $warning->next();
    }
}

$sql = "UPDATE users SET username='Übermäßig lange Namen werden abgeschnitten' WHERE id=1";

if ($mysqli->query($sql)) {
    log_warnings($mysqli);
} else {
    error_log("SQL Error: " . $mysqli->error);
}

Das Anmeldung in das Protokoll hilft nicht nur, Probleme später zu beheben, sondern bietet auch Feedback zur SQL -Qualität in der Testumgebung.

Dinge zu beachten

  1. get_warnings () funktioniert nur für die letzte Abfrage;

  2. Es gibt ein Objekt zurück, das einer verknüpften Liste ähnelt, die von Next () überquert wird.

  3. Nicht alle Treiber unterstützen Warnungen voll und ganz, und die Datenbankkonfiguration muss vor der Verwendung getestet werden.

  4. MySQLI_Report () kann Get_Warnings () nicht ersetzen, erstere achtet mehr auf Fehler.

  5. Verwenden Sie Vorbereitungsanweisungen ( Vorbereitung ), um Warnungen auszulösen und zu erhalten, wie dies bei Bindungsparametern der Fall ist.

Ergänzung: In Produktionsumgebungen verwendet

Möglicherweise möchten Sie Warnungen in der Produktion zusammenfassen und regelmäßig melden. Dies kann durch Einkapselung einer Datenbankassistentenklasse erfolgen:

 class DB {
    protected $mysqli;

    public function __construct() {
        $this->mysqli = new mysqli("localhost", "user", "password", "appdb");
    }

    public function query($sql) {
        $result = $this->mysqli->query($sql);
        if ($result) {
            $this->logWarnings();
        } else {
            error_log("SQL Error: " . $this->mysqli->error);
        }
        return $result;
    }

    protected function logWarnings() {
        $warning = $this->mysqli->get_warnings();
        while ($warning) {
            error_log("[DBwarnen] {$warning->errno} - {$warning->message}");
            $warning = $warning->next();
        }
    }
}

$db = new DB();
$db->query("UPDATE posts SET title='标题过长会触发warnen,Achten Sie auf die Längenkontrolle' WHERE id=42");

Zusammenfassen

Mysqli :: query () ist ein leistungsstarkes Tool zur Ausführung von SQL, während MySQLI :: get_warnings () eine wichtige Ergänzung ist, um die Datenintegrität zu gewährleisten. Ignorieren Sie diese Warnmeldungen nicht, sie verbergen häufig Ihre zukünftigen Fehler. Die Entwicklung der Gewohnheit, Warnungen in einer Entwicklung oder Testumgebung zu erfassen und zu behandeln, verbessert die Robustheit und Wartbarkeit Ihres Projekts erheblich.

Denken Sie daran: Wenn der Fehler das Programm verfallen lässt, wird die Warnung dazu führen, dass Sie die Falle verlieren.