MySQLI :: Get_Warnings est une méthode d'un objet MySQLI qui récupère tous les avertissements générés dans une opération MySQL récente. Les avertissements ne provoquent généralement pas de défaillances de requête, mais peuvent contenir des informations importantes, telles que la troncature des données, la conversion de type implicite, etc., qui sont utiles pour assurer la précision et le débogage des données.
Après avoir exécuté une instruction SQL qui peut générer un avertissement, obtenez l'objet d'avertissement via get_warnings :
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("INSERT INTO users (id, name) VALUES (1, 'Alice'), (1, 'Bob')"); // Violation possible des contraintes uniques
if ($warning = $mysqli->get_warnings()) {
do {
printf("Warning: %d: %s\n", $warning->errno, $warning->message);
} while ($warning->next());
$warning->close();
}
?>
Dans ce code, get_warnings () renvoie un objet mysqli_warning qui peut traverser tous les avertissements et les signes d'avertissement de sortie et les messages d'avertissement.
Si vous utilisez des exceptions pour assister aux erreurs de base de données dans votre projet, vous pouvez toujours obtenir des avertissements non mortels via Get_Warnings :
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
try {
$mysqli->query("UPDATE products SET price = price * 1.1 WHERE id = 5");
if ($warning = $mysqli->get_warnings()) {
do {
error_log("MySQL Warning: {$warning->errno} - {$warning->message}");
} while ($warning->next());
$warning->close();
}
} catch (mysqli_sql_exception $e) {
echo "Error: " . $e->getMessage();
}
?>
À l'heure actuelle, des erreurs normales sont capturées par des exceptions et les avertissements sont connectés au journal.
Lorsque la rédaction de données par lots ou les transactions complexes sont effectuées, les informations d'avertissement sont particulièrement importantes, ce qui peut susciter des problèmes tels que la troncature des données ou les contraintes qui ne sont pas pleinement respectées:
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$values = [
"(1, 'LongNameExceedingLimit')",
"(2, 'NormalName')"
];
$sql = "INSERT INTO customers (id, name) VALUES " . implode(',', $values);
$mysqli->query($sql);
if ($warning = $mysqli->get_warnings()) {
while ($warning) {
echo "Warning {$warning->errno}: {$warning->message}\n";
$warning = $warning->next();
}
}
?>
Cela peut aider à détecter les avertissements de troncature des données telles que le débordement de la longueur du champ.
GET_WARNings s'appuie sur MySQL Server pour prendre en charge les messages d'avertissement et nécessite généralement MySQL 5.6 et plus. La version inférieure peut ne pas renvoyer un avertissement ou se comporter instable.
Lorsqu'une requête SQL échoue en raison d'une erreur grave, GET_WARNINGS ne renvoie pas de message d'avertissement et l'erreur doit être capturée par le mécanisme de gestion des erreurs.
L'objet renvoyé en appelant get_warnings () doit appeler explicitement la méthode close () pour libérer la ressource sous-jacente pour éviter la fuite de mémoire.
Les messages d'avertissement exposent parfois les détails SQL ou l'état des données. Assurez-vous de gérer soigneusement la sortie du journal dans les environnements de production pour éviter les fuites d'informations.
MySQLI :: Get_Warnings est un outil efficace pour surveiller les avertissements de la base de données dans le développement de PHP. Il peut détecter à l'avance des problèmes de données potentiels et des dangers cachés à l'aide. Il est recommandé d'appeler cette fonction après d'importantes opérations de base de données, de combiner des journaux ou des outils de débogage pour améliorer la stabilité et la maintenabilité du programme. Dans le même temps, faites attention à la compatibilité de la version MySQL et à la version des ressources pour garantir les performances et la sécurité de l'application.