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.
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
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.
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);
}
}
}
}
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());
}
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.
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.
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