Dans PHP, l'extension MySQLI fournit des interfaces riches pour le fonctionnement des bases de données MySQL, où la fonction MySQLI :: get_warnings est utilisée pour obtenir des informations d'avertissement générées par la dernière opération de base de données. Bien que cette fonction fonctionne bien dans MySQL 5.6 et plus, il existe certaines différences de compatibilité et de performances dans différentes versions de MySQL, et les développeurs peuvent rencontrer des problèmes lors de l'utilisation. Cet article présentera les problèmes de compatibilité de MySQLI :: Get_Warnings en détail et fournira des solutions correspondantes.
MySQLI :: Get_Warnings est une méthode de la classe MySQLI qui renvoie une chaîne d'objets MySQLI_WARNING contenant des informations d'avertissement pour l'exécution la plus récente du fonctionnement de la connexion actuelle. Les informations d'avertissement comprennent des codes d'avertissement, des messages et des niveaux d'avertissement.
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
if ($mysqli->connect_error) {
die("Échec de la connexion: " . $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());
}
Le code ci-dessus montre comment obtenir et traverser la chaîne d'avertissement.
Impact de la version mysql
MySQL 5.6 et plus
MySQL 5.6 a commencé à améliorer le soutien aux avertissements. MySQLI :: Get_Warnings peut fonctionner correctement et renvoie des messages d'avertissement.
MySQL 5.5 et moins <br> Dans MySQL 5.5 et plus tôt, le support du mécanisme d'avertissement est limité. Dans certains cas, MySqli :: Get_Warnings peut retourner faux , qui ne peut pas être obtenu même si l'avertissement existe réellement.
Impact de la configuration MySQL
Certains paramètres de configuration (tels que SQL_Notes ) affectent la génération et l'enregistrement des avertissements. La désactivation de l'enregistrement des messages d'avertissement entraînera que get_warnings () ne parviendra pas à obtenir l'avertissement.
Version PHP et pilote mysqli
La version PHP et la version du pilote MySQLI affecteront également les performances de cette méthode. Les premières versions PHP des extensions MySQLI prennent en charge les chaînes d'avertissement sont incomplètes.
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$mysqli->query("INSERT INTO test_table VALUES (1, 'duplicate')"); // Supposons que la clé primaire est répétée,Générer un avertissement
$warnings = $mysqli->get_warnings();
if ($warnings === false) {
echo "Impossible d'obtenir un avertissement,peut êtreMySQLLa version ou la configuration ne prend pas en charge。";
} else {
do {
echo "Code d'avertissement: " . $warnings->errno . ", information: " . $warnings->message . "\n";
} while ($warnings = $warnings->next());
}
Dans MySQL 5.5 ou plus tôt, les avertissements de $ peuvent retourner faux directement et ne peuvent pas obtenir d'avertissements.
Détecter la version mysql
Avant d'exécuter la logique pertinente, détectez la version MySQL actuelle et décidez d'appeler get_warnings () .
$version = $mysqli->server_info;
if (version_compare($version, '5.6.0', '>=')) {
// soutienget_warnings
$warnings = $mysqli->get_warnings();
} else {
$warnings = false;
}
Alternatives d'avertissement SQL
Si la version MySQL est inférieure et ne peut pas utiliser get_warnings () , vous pouvez obtenir manuellement l'avertissement en exécutant la commande show avertissements SQL.
$result = $mysqli->query("SHOW WARNINGS");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo "Level: " . $row['Level'] . ", Code: " . $row['Code'] . ", Message: " . $row['Message'] . "\n";
}
}
Emballage unifié
Il est recommandé d'encapsuler une fonction et de changer automatiquement l'avertissement pour obtenir la méthode selon la version:
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;
}
}
Bien que la fonction MySQLI :: get_warnings soit une interface idéale pour obtenir des informations d'avertissement MySQL, en raison des différences dans la version MySQL, la configuration et la version PHP, des problèmes de compatibilité peuvent être rencontrés à une utilisation réelle. Pour résoudre ces problèmes, les développeurs peuvent:
Détecter à l'avance la version mysql
Les avertissements de montre sont utilisés dans le temps
Encapsulation unifiée de la logique d'acquisition d'avertissement pour améliorer la robustesse et la compatibilité du code
De cette façon, il peut garantir que les informations d'avertissement de base de données peuvent être obtenues efficacement dans différents environnements, améliorant la stabilité des applications et l'expérience utilisateur.