La fonction Next_Result () joue un rôle crucial lors de la gestion des requêtes multi-statement à l'aide de l'extension MySQLI de PHP et MySQL. Il vous permet de récupérer plusieurs ensembles de résultats en séquence, mais parfois vous pouvez rencontrer divers problèmes inattendus lors de la commutation des ensembles de résultats, tels que "Commandes hors synchronisation; vous ne pouvez pas exécuter cette commande maintenant". Cet article présentera comment localiser et résoudre les problèmes liés à la fonction Next_Result () via la journalisation.
MySQLI :: Multi_Query () vous permet d'envoyer plusieurs instructions SQL dans une requête, tandis que Next_Result () est utilisé pour parcourir ces ensembles de résultats à son tour. Par exemple:
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
} else {
error_log("Query failed: " . $mysqli->error);
}
Si next_result () n'est pas appelé correctement ou si une erreur se produit au milieu, elle entraînera une exception à l'état de connexion.
Message d'erreur: "Commandes hors synchronisation; vous ne pouvez pas exécuter cette commande maintenant"
Requête interrompue, le résultat est incomplet
Impossible de continuer à exécuter le prochain SQL
La plupart de ces problèmes sont liés au fait que le résultat n'est pas entièrement traité ou que l'appel à next_result () n'est pas appelé.
Pour résoudre les problèmes, nous pouvons enregistrer le journal à chaque étape et suivre le processus et l'état d'appel. Il est recommandé d'utiliser Error_Log () pour écrire dans les fichiers journaliers:
function log_step($message) {
$logFile = '/var/log/php_next_result_debug.log';
error_log(date("[Y-m-d H:i:s] ") . $message . PHP_EOL, 3, $logFile);
}
En combinaison avec l'exemple de requête ci-dessus, nous ajoutons la sortie du journal:
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
log_step("Multi-query started.");
do {
if ($result = $mysqli->store_result()) {
log_step("Result set retrieved.");
while ($row = $result->fetch_assoc()) {
log_step("Row: " . json_encode($row));
}
$result->free();
} elseif ($mysqli->errno) {
log_step("Error during store_result: " . $mysqli->error);
}
log_step("Calling next_result()...");
} while ($mysqli->next_result());
log_step("All result sets processed.");
} else {
log_step("Multi-query failed: " . $mysqli->error);
}
Si un suivi plus détaillé est requis, le contenu SQL, le temps d'exécution et le code d'état peuvent être enregistrés à chaque point d'exécution SQL. De plus, les journaux peuvent être gérés de manière centralisée visuellement, par exemple en les envoyant à des plates-formes de journalisation des wapitis, des gris ou des auto-construits.
log_step("SQL Executed: " . $sql . " on https://gitbox.net/db-query-monitor");
Traitez toujours tous les ensembles de résultats et appelez next_result () .
Utilisez des journaux pour enregistrer toutes les étapes clés pour une trappe de post-dérive facile.
N'ignorez pas MySQLI :: Erreur et MySqli :: Errno lorsqu'une exception se produit.
Il peut encapsuler une fonction d'exécution multi-requier unifiée avec une logique de journal intégrée pour une réutilisation facile.