Aktueller Standort: Startseite> Neueste Artikel> Erkennen Sie doppelte Schlüsselprobleme, wenn Sie MySQLI :: get_warnings verwenden

Erkennen Sie doppelte Schlüsselprobleme, wenn Sie MySQLI :: get_warnings verwenden

gitbox 2025-05-29

Warum muss ich MySQLI :: get_warnings () verwenden?

Beim Ausführen von Batch -Einfügungsvorgängen wird bei Verwendung von Ignorieren oder auf doppelter Schlüsseldat . verwendet, MySQL meldet nicht direkt einen Fehler, sondern auch Warnungen. Zu diesem Zeitpunkt fällt es uns schwierig, spezifische Konfliktinformationen durch den Fehlererfassungsmechanismus zu erhalten. Mysqli :: get_warnings () kann diese Warnungen erhalten, um zu verstehen, welche Aufzeichnungen Konflikte.

Beispielcode

Angenommen, es gibt die folgenden Benutzer der Datentabelle, und eine eindeutige Schlüssel -E -Mail wird definiert:

 CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100) UNIQUE
);

Wir versuchen, mehrere Daten in Stapel mit doppelten E -Mails einzufügen:

 <?php
$mysqli = new mysqli("localhost", "root", "password", "testdb");

if ($mysqli->connect_errno) {
    die("Es wurde keine Verbindung zur Datenbank hergestellt: " . $mysqli->connect_error);
}

// Bereiten Sie die Stapelinsertion vorSQLStellungnahme
$sql = "INSERT IGNORE INTO users (name, email) VALUES 
        ('Alice', '[email protected]'), 
        ('Bob', '[email protected]'),
        ('Charlie', '[email protected]')";  // Achten auf dieemailwiederholen

if ($mysqli->query($sql)) {
    echo "Führen Sie vollständig ein。<br>";

    // passieren get_warnings() 检测是否有wiederholen键冲突警告
    if ($warning = $mysqli->get_warnings()) {
        do {
            echo "Warnstufe: " . $warning->get_errno() . "<br>";
            echo "Warnmeldung: " . $warning->get_message() . "<br>";
        } while ($warning->next());
    } else {
        echo "Keine Warnmeldung。";
    }
} else {
    echo "Einfügen fehlgeschlagen: " . $mysqli->error;
}

$mysqli->close();

Im obigen Code verwenden wir Ignores Ignorieren , um Daten einzufügen. Wenn eine doppelte E -Mail auftritt, ignoriert MySQL die Einführung des Datensatzes, erzeugt jedoch eine Warnung. Diese Warninformationen können über $ MySQLI-> get_warnings () erhalten werden, um zu wissen, dass es einen doppelten Schlüsselkonflikt gibt.

Detaillierte Erläuterung des Objekts von MySQLI_WARNE

Mysqli :: get_warnings () gibt ein MySQLI_WARNING -Objekt zurück. Sie können die folgende Methode anrufen, um detaillierte Informationen zu erhalten:

  • get_errno () : Erhalten Sie den Fehlercode für die Warnung

  • get_message () : Holen Sie sich die Warnmeldungstext

  • Weiter () : Wechseln Sie zur nächsten Warnung (falls vorhanden)

Normalerweise beträgt der Warncode für wiederholte Schlüsselkonflikte 1062 und die entsprechende Nachricht enthält "doppelte Eintrag".

Dinge zu beachten

  1. Wenn keine Ignorierungen einfügen oder ähnliche Richtlinien nicht verwendet werden, können doppelte Schlüsselkonflikte die Abfrage direkt fehlschlagen, wodurch ein Fehler statt einer Warnung zurückgegeben wird.

  2. Get_Warnings () gibt eine Warnkette zurück und erfordert eine Schleifenquelle, um alle Warnungen zu erhalten.

  3. Die Warninformationen sind relativ detailliert und können verwendet werden, um widersprüchliche Aufzeichnungen genau zu lokalisieren.


Durch MySQLI :: get_warnings () können wir während der Stapelinsertion doppelte Schlüsselkonflikte eleganter behandeln, was nicht nur die Kontinuität des Dateneinfügungsgeräts sicherstellt, sondern auch die Datenqualitätsprobleme versteht und die Robustheit des Programms verbessert.


 <?php
$mysqli = new mysqli("localhost", "root", "password", "testdb");

if ($mysqli->connect_errno) {
    die("Es wurde keine Verbindung zur Datenbank hergestellt: " . $mysqli->connect_error);
}

$sql = "INSERT IGNORE INTO users (name, email) VALUES 
        ('Alice', '[email protected]'), 
        ('Bob', '[email protected]'),
        ('Charlie', '[email protected]')";

if ($mysqli->query($sql)) {
    echo "Führen Sie vollständig ein。<br>";

    if ($warning = $mysqli->get_warnings()) {
        do {
            echo "Warnstufe: " . $warning->get_errno() . "<br>";
            echo "Warnmeldung: " . $warning->get_message() . "<br>";
        } while ($warning->next());
    } else {
        echo "Keine Warnmeldung。";
    }
} else {
    echo "Einfügen fehlgeschlagen: " . $mysqli->error;
}

$mysqli->close();