Lorsque vous utilisez PHP pour manipuler les bases de données MySQL, les développeurs peuvent utiliser des extensions MySQLI pour gérer des requêtes complexes, en particulier lors de l'appel de procédures stockées ou de l'exécution de plusieurs instructions SQL, la fonction suivante_result () est particulièrement importante. Cette fonction est utilisée pour le traitement, c'est-à-dire lorsque plusieurs résultats sont renvoyés dans une requête (comme la sortie de plusieurs sélections ou procédures stockées), ils peuvent être traversés via next_result () .
Cependant, appeler next_result () sans plusieurs ensembles de résultats est risqué.
Lorsque vous exécutez SQL comme ce qui suit:
CALL get_user_and_orders(1);
Cette procédure stockée peut renvoyer deux ensembles de résultats:
Le premier est les informations utilisateur;
Le second est les informations de commande de l'utilisateur.
Pour obtenir ces deux ensembles de résultats correctement, vous devez gérer ceci:
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->multi_query("CALL get_user_and_orders(1)")) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
}
Ici, next_result () est logique - il essaiera de lire le prochain ensemble de résultats.
Si le SQL que vous exécutez ne renvoie pas plusieurs résultats, comme une question simple:
$mysqli->multi_query("SELECT * FROM users WHERE id = 1");
À l'heure actuelle, vous appelez Next_Result () :
$mysqli->next_result();
Cela peut présenter les risques suivants:
Bien que Next_Result () ne signale pas directement une erreur (il renvoie false ), si vous ne consommez pas le jeu de résultats actuel correctement (tel que l'appel Store_Result () ), l'appeler peut provoquer une erreur "Commandes hors synchronisation" .
En effet
Si vous ne traitez pas explicitement l'ensemble de résultats actuel et accédez directement à Next_Result () , le serveur MySQL estime toujours que vous n'avez pas encore lu le résultat précédent et conserverez les ressources, en particulier dans les boucles ou les appels par lots qui peuvent facilement provoquer une fuite de ressources de connexion .
Le Next_Result () sans signification peut donner l'impression que le code devrait avoir plusieurs résultats, mais c'est en fait une erreur logique qui augmente les coûts de maintenance et les tromperies .
Assurez-vous d'utiliser next_result () uniquement si:
Utiliser Multi_Query () ou exécuter les procédures stockées;
Confirmez que votre SQL renvoie plusieurs résultats;
L'ensemble de résultats précédent est consommé avant que Next_Result () ne soit appelé.
Vous pouvez également encapsuler la logique suivante:
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// Traiter l'ensemble de résultats actuel
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
Cette écriture garantit que Next_Result () est appelé uniquement s'il y a plus d'ensembles de résultats, ce qui est plus sûr.
Appeler Next_Result () sans plusieurs ensembles de résultats peut facilement entraîner des problèmes tels que les ressources qui ne sont pas relâchées, les erreurs hors synchronisation et la confusion logique. Assurez-vous de comprendre votre structure de requête, déterminez si plusieurs ensembles de résultats sont vraiment nécessaires pour être traités et évitez les appels inutiles.
En bref, bien que Next_Result () soit un outil important pour gérer les ensembles multi-toits, "l'utiliser correctement" est plus important que "l'utiliser plus".