In PHP enthält die MySQLI -Erweiterung reichhaltige Schnittstellen für den Betrieb von MySQL -Datenbanken, in denen die Funktion mySQLi :: get_warnings verwendet wird, um Warninformationen zu erhalten, die durch die neueste Datenbankoperation generiert werden. Obwohl diese Funktion in MySQL 5.6 und höher gut abschneidet, gibt es einige Unterschiede in der Kompatibilität und Leistung in verschiedenen Versionen von MySQL, und Entwickler können bei der Verwendung auf Probleme stoßen. In diesem Artikel werden die Kompatibilitätsprobleme von MySQLI :: get_warnings im Detail vorgestellt und entsprechende Lösungen bereitgestellt.
Mysqli :: get_warnings ist eine Methode der MySQLI -Klasse, die eine mySQLI_WARNING -Objektkette zurückgibt, die Warninformationen für die jüngste Ausführung des Betriebs der aktuellen Verbindung enthält. Warninformationen umfassen Warncodes, Nachrichten und Warnstufen.
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
if ($mysqli->connect_error) {
die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}
$mysqli->query("YOUR SQL STATEMENT");
if ($warning = $mysqli->get_warnings()) {
do {
echo "Warning: (" . $warning->errno . ") " . $warning->message . "\n";
} while ($warning = $warning->next());
}
Der obige Code zeigt, wie man die Warnkette bekommt und durchquert.
MySQL Version Impact
Mysql 5.6 und höher
MySQL 5.6 hat begonnen, die Unterstützung für Warnungen zu verbessern. Mysqli :: get_warnings kann ordnungsgemäß funktionieren und gibt Warnmeldungen zurück.
MySQL 5.5 und unten <br> In MySQL 5.5 und früher ist der Warnmechanismus begrenzt. In einigen Fällen kann MySQLI :: get_warnings falsch zurückkehren, was auch dann nicht erhalten werden kann, wenn die Warnung tatsächlich existiert.
MySQL -Konfiguration Wirkung
Bestimmte Konfigurationsparameter (z. B. SQL_NOTES ) beeinflussen die Erzeugung und Aufzeichnung von Warnungen. Wenn Sie die Aufzeichnung von Warnmeldungen ausschalten, werden Get_Warnings () die Warnung nicht erhalten.
PHP -Version und MySQLi -Treiber
Die PHP -Version und die MySQLI -Treiberversion beeinflussen auch die Leistung dieser Methode. Frühe PHP -Versionen von MySQLI -Erweiterungen unterstützen für Warnketten unvollständig.
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$mysqli->query("INSERT INTO test_table VALUES (1, 'duplicate')"); // Angenommen, der Primärschlüssel wird wiederholt,Eine Warnung erzeugen
$warnings = $mysqli->get_warnings();
if ($warnings === false) {
echo "Warnung kann nicht bekommen,VielleichtMySQLVersion oder Konfiguration unterstützt nicht。";
} else {
do {
echo "Warncode: " . $warnings->errno . ", Information: " . $warnings->message . "\n";
} while ($warnings = $warnings->next());
}
In MySQL 5.5 oder früher können $ Warnungen direkt falsch zurückkehren und keine Warnungen erhalten.
MySQL -Version erkennen
Erkennen Sie vor der Ausführung der relevanten Logik die aktuelle MySQL -Version und entscheiden Sie, ob Sie Get_Warnings () aufrufen sollen.
$version = $mysqli->server_info;
if (version_compare($version, '5.6.0', '>=')) {
// Unterstützungget_warnings
$warnings = $mysqli->get_warnings();
} else {
$warnings = false;
}
SQL Warnalternativen
Wenn die MySQL -Version niedriger ist und Get_Warnings () nicht verwenden kann, können Sie die Warnung manuell erhalten, indem Sie den Befehl show warnungen ausführen.
$result = $mysqli->query("SHOW WARNINGS");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo "Level: " . $row['Level'] . ", Code: " . $row['Code'] . ", Message: " . $row['Message'] . "\n";
}
}
Einheitliche Verpackung
Es wird empfohlen, eine Funktion zu verringern und die Warnung automatisch zu wechseln, um die Methode gemäß der Version zu erhalten:
function getMysqlWarnings(mysqli $mysqli) {
if (version_compare($mysqli->server_info, '5.6.0', '>=')) {
$warnings = $mysqli->get_warnings();
$allWarnings = [];
if ($warnings !== false) {
do {
$allWarnings[] = [
'errno' => $warnings->errno,
'message' => $warnings->message,
];
} while ($warnings = $warnings->next());
}
return $allWarnings;
} else {
$result = $mysqli->query("SHOW WARNINGS");
$allWarnings = [];
if ($result) {
while ($row = $result->fetch_assoc()) {
$allWarnings[] = [
'level' => $row['Level'],
'code' => $row['Code'],
'message' => $row['Message'],
];
}
}
return $allWarnings;
}
}
Obwohl die Funktion MySQLI :: get_warnings eine ideale Schnittstelle zum Erhalten von MySQL -Warninformationen ist, sind Unterschiede in der MySQL -Version, der Konfiguration und der PHP -Version möglicherweise bei der tatsächlichen Verwendung auftretend. Um diese Probleme anzugehen, können Entwickler:
MySQL -Version im Voraus erkennen
Showwarnungen werden rechtzeitig verwendet
Einheitliche Kapselung der Warnakquisitionslogik zur Verbesserung der Code -Robustheit und -kompatibilität
Auf diese Weise kann sichergestellt werden, dass Datenbankwarninformationen in verschiedenen Umgebungen effektiv erhalten werden können, wodurch die Anwendungsstabilität und die Benutzererfahrung verbessert werden können.