Next_Result () est une fonction cruciale lors de l'utilisation de l'extension MySQLI de PHP pour les opérations multi-requins de base de données. Il est utilisé pour traiter plusieurs ensembles de résultats après une procédure stockée ou envoyer plusieurs instructions SQL à la fois. Cependant, de nombreux développeurs ignorent un détail lors de l'utilisation de next_result () : avant d'appeler next_result () , cela peut causer de graves problèmes.
Lors de l'exécution de plusieurs instructions SQL à l'aide de mysqli :: multi_query () , chaque instruction peut renvoyer un ensemble de résultats. Vous devez utiliser store_result () ou use_result () pour traiter l'ensemble de résultats actuel, puis utiliser next_result () pour passer au jeu de résultats suivant.
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM products;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free(); // Une étape très importante
}
} while ($mysqli->next_result());
}
MySQLI :: next_result () fonctionne tant que l'ensemble de résultats actuel a été effacé ou libéré. Si vous sautez les étapes de magasin_result () ou libres () , next_result () peut ne pas être déplacé correctement vers l'ensemble de résultats suivant, ce qui entraîne des résultats de requête ultérieurs qui ne sont jamais traités.
Voici les messages d'erreur les plus courants:
Commands out of sync; you can't run this command now
Cette erreur signifie que vous avez le mauvais ordre d'opérations sur MySQL, comme essayer d'exécuter une nouvelle requête ou accéder au jeu de résultats suivant avant de traiter l'ensemble de résultats actuel.
Bien que le mécanisme de collecte des ordures de PHP puisse généralement traiter automatiquement les ressources, dans de grands volumes de données ou des scénarios de connexion longs, si l'ensemble de résultats actuel n'est pas manuellement libre () , il peut entraîner une croissance de mémoire lente, ce qui affectera finalement les performances de l'application.
Appelez toujours Store_Result () et libre () Les résultats actuels définissent dans le temps.
Utilisez une structure de boucle claire pour vous assurer que chaque ensemble de résultats est traité proprement.
Ajoutez des vérifications d'erreur pour chaque étape pour éviter les ratés logiques.
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// Résultats de traitement
$result->free();
} else {
if ($mysqli->errno) {
echo "La requête a échoué: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
Lorsque vous utilisez Multi_Query () et Next_Result () , assurez-vous de vous souvenir: Traiter un ensemble de résultats avant de demander à l'étiquette de base est l'étiquette de base pour que vous puissiez bien interagir avec la base de données. Sinon, vous pourrez bientôt voir de nombreuses erreurs inexplicables "Commandes hors synchronisation" dans le système de soumission de bogue de gitbox.net .