Mysqli :: get_warnings gibt eine Kette von MySQLI_WARNING -Objekten zurück, die alle Warnungen enthalten, wenn SQL -Anweisungen ausgeführt werden. Verwenden Sie diese Funktion, um nicht tödliche Probleme wie Datenverschmutzung, Datentypfehlanpassung, Indexversagen usw. für eine einfache nachfolgende Verarbeitung zu erfassen.
Es ist jedoch umständlich, diese Methode direkt aufzurufen, und es erfordert das Durchqueren der zurückgegebenen Verbindungslistenstruktur. Nachdem sie in eine Klassenmethode eingekapselt ist, kann der Aufrufprozess vereinfacht und die Warninformationen einheitlich behandelt werden.
Fügen Sie eine öffentliche Methode hinzu, um Warninformationen in der Datenbank -Treiberklasse zu erhalten.
Diese Methode nennt MySQLi :: get_warnings und iteriert die Warnliste, wodurch alle Warnungen in ein Array oder eine Zeichenfolge sortiert werden.
Bietet eine formatierte Ausgabe für eine einfache Protokollierung oder Anzeige.
Diese Methode wird proaktiv bezeichnet, nachdem SQL -Operationen durchgeführt wurden, um potenzielle Probleme zu erfassen.
<?php
class DatabaseDriver
{
/** @var mysqli */
protected $mysqli;
public function __construct($host, $user, $password, $dbname, $port = 3306)
{
$this->mysqli = new mysqli($host, $user, $password, $dbname, $port);
if ($this->mysqli->connect_errno) {
throw new Exception("Connect failed: " . $this->mysqli->connect_error);
}
}
/**
* implementieren SQL Abfrage
*
* @param string $sql
* @return mysqli_result|bool
*/
public function query(string $sql)
{
$result = $this->mysqli->query($sql);
// Abfrage后可以检查警告
$warnings = $this->getWarnings();
if (!empty($warnings)) {
// Sie können hier Protokollierung oder Ausnahmehandling durchführen
foreach ($warnings as $warning) {
error_log("MySQL Warning [{$warning['errno']}]: {$warning['message']} (SQLSTATE: {$warning['sqlstate']})");
}
}
return $result;
}
/**
* Holen Sie sich alle Warnmeldungen für die aktuelle Verbindung
*
* @return array Warnmeldung Array,Jedes Element enthält errno, sqlstate, message
*/
public function getWarnings(): array
{
$warnings = [];
$warning = $this->mysqli->get_warnings();
while ($warning) {
$warnings[] = [
'errno' => $warning->errno,
'sqlstate' => $warning->sqlstate,
'message' => $warning->message,
];
$warning = $warning->next;
}
return $warnings;
}
public function close()
{
$this->mysqli->close();
}
}
// Beispiel für die Nutzung
$db = new DatabaseDriver('localhost', 'root', 'password', 'testdb');
$db->query("INSERT INTO users (id, name) VALUES (1, 'Alice')");
$db->close();
get_warnings gibt eine Warnung für die aktuelle Verbindung zurück und kann wiederholt alte Warnungen lesen, wenn sie nicht ordnungsgemäß gereinigt oder verwendet werden. Normalerweise können Warnungen gelesen und gereinigt werden, nachdem jede Aussage ausgeführt oder gegebenenfalls MySQLi :: Clear_warnings () (unterstützt von Php 8.1+) aufgerufen werden kann, um die Warnkette zu löschen, um die Störung mit nachfolgenden Operationen zu verhindern.
Es wird empfohlen, Warninformationen in einem Array in der Kapselung zurückzugeben. Die aufrufende Ebene kann entscheiden, ob Protokolle aufgezeichnet werden oder Ausnahmen entsprechend den Anforderungen verteilt werden, was die Flexibilität verbessert.
Einige frühe PHP -Versionen unterstützen unvollständige Unterstützung für get_warnings . Die Versionskompatibilität sollte bei der Einkapselung berücksichtigt werden, oder die Überprüfung der Versionsüberprüfung sollte verwendet werden, um auf andere Fehlerbehandlungsmethoden zurückzuführen.
Die Einkapselung von MySQLI :: get_warnings in der Datenbank -Treiberklasse verbessert nicht nur die Wiederverwendbarkeit des Codes, sondern erleichtert auch die Erfassung und Handhabung potenzieller SQL -Ausführungsprobleme. Durch eine angemessene Kapselung und Aufruf können die Robustheit und Debugging -Fähigkeiten des Systems erheblich verbessert werden.
Wenn Sie eine Datenbank -Treiberklasse entwerfen oder pflegen, wird dringend empfohlen, Warnfassungsmechanismen einzubeziehen und sie mit Protokoll- oder Ausnahmemechanismen zu kombinieren, um Datenbankoperationen transparenter und sicherer zu gestalten.