Aktueller Standort: Startseite> Neueste Artikel> Wie man MySQLI :: get_warnings in ein universelles Warnfassungsmodul inkapituliert

Wie man MySQLI :: get_warnings in ein universelles Warnfassungsmodul inkapituliert

gitbox 2025-05-26

Bei der Verbindung und Manipulation von MySQL -Datenbanken mithilfe von PHP bietet die MySQLI -Erweiterung reichhaltige Methoden wie MySQLi :: Query , MySQLI :: Preped usw., um SQL auszuführen. In der tatsächlichen Entwicklung müssen wir jedoch nicht nur darauf achtet, ob SQL erfolgreich ist, manchmal auch den Ausführungsprozess erhalten. Diese Warnungen führen möglicherweise nicht dazu, dass die SQL -Ausführung scheitert, aber sie verbergen potenzielle Probleme.

PHPs MySQLI :: Get_Warnings -Methode kann alle Warnungen durch den letzten Operation in der Verbindung erzeugen. Die Verwendung wird jedoch häufig fragmentiert, und wenn wir es in ein Modul einwickeln können, kann es im Projekt leicht wiederverwendet werden und den Code ordentlich halten.

In diesem Artikel wird beschrieben, wie MySQLI :: get_warnings in ein wiederverwendbares MySQL -Warnfassungsmodul in MySQL Warning Capture zusammenfasst.

1. Hintergrundwissen

Die MySQLI :: Get_Warnings () -Methode gibt einen Verweis auf die verknüpfte Liste von MySQLi_Warning -Objekten zurück, über die auf alle Warninformationen zugegriffen werden können. Jedes MySQLi_Warning -Objekt enthält die folgenden Informationen:

  • Nachricht : Warnnachricht

  • SQLState : SQLState -Fehlercode

  • Errno : MySQL -Fehlercode

2. Moduldesign -Ideen

Unser Ziel ist es, eine WarningCollector -Klasse umzusetzen, die in der Lage ist:

  • Binden Sie an eine MySQLI -Instanz;

  • SQL -Anweisungen ausführen und automatisch Warninformationen sammeln.

  • Formatieren Sie die Warninformationen und geben Sie sie an das Protokoll zurück.

  • Geben Sie Warnreinigungsmethoden an, um zu vermeiden, dass Warninformationen verbleiben, um den nächsten Betrieb zu beeinflussen.

3.. Modulcode -Implementierung

Das Folgende ist der vollständige Implementierungscode:

 <?php

class WarningCollector
{
    private mysqli $conn;
    private array $warnings = [];

    public function __construct(mysqli $connection)
    {
        $this->conn = $connection;
    }

    public function execute(string $sql): bool|mysqli_result
    {
        $result = $this->conn->query($sql);
        $this->collectWarnings();
        return $result;
    }

    private function collectWarnings(): void
    {
        $this->warnings = []; // Alte Daten löschen
        $warning = $this->conn->get_warnings();
        while ($warning) {
            $this->warnings[] = [
                'errno'    => $warning->errno,
                'sqlstate' => $warning->sqlstate,
                'message'  => $warning->message,
            ];
            $warning = $warning->next();
        }
    }

    public function getWarnings(): array
    {
        return $this->warnings;
    }

    public function hasWarnings(): bool
    {
        return !empty($this->warnings);
    }

    public function logWarnings(string $logPath = '/tmp/mysql_warnings.log'): void
    {
        if ($this->hasWarnings()) {
            foreach ($this->warnings as $w) {
                $entry = sprintf(
                    "[%s] MySQL Warning - Errno: %d, SQLSTATE: %s, Message: %s\n",
                    date('Y-m-d H:i:s'),
                    $w['errno'],
                    $w['sqlstate'],
                    $w['message']
                );
                file_put_contents($logPath, $entry, FILE_APPEND);
            }
        }
    }
}

4. Verwenden Sie Beispiele

Die Verwendung dieses Moduls ist sehr einfach. Verwenden Sie es einfach, um die Verbindung zu verkapulieren, bevor Sie SQL ausführen:

 <?php

$mysqli = new mysqli('localhost', 'user', 'pass', 'database');
$collector = new WarningCollector($mysqli);

// implementieren SQL
$sql = "INSERT INTO demo (name) VALUES ('duplicate-key')";
$collector->execute($sql);

// Warnung überprüfen
if ($collector->hasWarnings()) {
    $collector->logWarnings();
    print_r($collector->getWarnings());
}

5. Praktische Anwendungsszenarien

Diese Kapselung ist besonders in den folgenden Projektkategorien nützlich:

  • Datenmigrationsskript: Warnung kann die Auskürzung des Exkursion oder die Nichtübereinstimmung angeben.

  • Batch-Import-Tool: Einschränkungsbezogene Warnungen können leicht ausgelöst werden, wenn große Datenstapel eingefügt werden.

  • Datenqualitätsüberwachung: Zentralisierte Erfassung von Warnungen über das Protokollsystem für die spätere Analyse;

Wenn Sie Frameworks wie Laravel, Symfony usw. verwenden, können Sie sie auch in Middleware- oder Service -Klassen basierend auf dieser Idee für die Abhängigkeitsinjektion einschließen.

6. Dinge zu beachten

  • Mysqli :: get_warnings () kann nur Warnungen durch die letzte Operation generieren. Rufen Sie sie daher unmittelbar nach jeder SQL -Ausführung an.

  • Wenn Sie vorbereitete Aussagen verwenden, wird empfohlen, sicherzustellen, dass Sie vor der Warnung ausführen .

  • Unterschiedliche MySQL -Versionen bieten ein leicht unterschiedliches Maß an Warnungen für Warnungen, und es wird empfohlen, dass die Entwicklungs- und Produktionsumfeldversionen konsistent sind.

7. Schlussfolgerung

Indem wir MySQLI :: get_warnings in Module einkapseln, erfassen und bewältigen wir nicht nur SQL -Warnungen, sondern helfen auch, die Wartbarkeit und Robustheit des Systems zu verbessern. Sie können nach Ihrer Projektstruktur weiter erweitern, z. B. das Hinzufügen von Protokollkanalunterstützung, Warnstufefilterung usw.

Für vollständige Projektbeispiele finden Sie unter:
https://gitbox.net/example/mysql-warning-collector