Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, la fonction Next_Result () est souvent utilisée pour traiter les requêtes contenant plusieurs ensembles de résultats (par exemple, des appels multi_query () qui exécutent plusieurs instructions SQL). Cependant, les développeurs constatent parfois que la fonction renvoie false , ce qui peut entraîner des ensembles de résultats ultérieurs non disponibles. Alors, quelles sont les raisons pour lesquelles next_result () renvoie false ? Comment dépanner et le résoudre?
Cet article analysera ce problème en détail.
MySQLI :: next_result () est une méthode utilisée pour passer à l'ensemble de résultats suivant, utilisé avec Multi_Query () . Habituellement, lors de l'exécution de la requête multi-statement, il est nécessaire de l'utiliser pour obtenir chaque résultat un résultat un par un.
Exemples d'utilisation de base:
$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 {
echo "Query Error: " . $mysqli->error;
}
La raison la plus courante est que tous les ensembles de résultats ont été lus . À l'heure actuelle, appeler next_result () reviendra faux , indiquant "plus de résultats".
Solution: Contrôlez simplement les conditions de terminaison du cycle raisonnablement, aucun traitement supplémentaire n'est requis.
Si l'une des multiples instructions SQL exécutées par Multi_Query () échoue, Next_Result () reviendra False et $ mysqli-> Erreur aura des informations d'erreur spécifiques.
Exemple:
$sql = "SELECT * FROM valid_table; SELECT * FROM invalid_table;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// Résultats de traitement
$result->free();
} else {
if ($mysqli->errno) {
echo "Error: " . $mysqli->error;
break;
}
}
} while ($mysqli->next_result());
}
Si l'ensemble de résultats précédent n'est pas libéré correctement ou n'est pas explicitement extrait via Store_Result () , il peut entraîner des problèmes avec next_result () , en particulier dans les anciennes versions de PHP ou MySQL.
Suggestion: appelez toujours $ result-> gratuit () ou $ mysqli-> store_result () même si vous ne traitez pas le contenu des résultats.
Multi_Query () prend en charge plusieurs instructions, mais ne prend pas en charge les combinaisons d'instructions de tous types. Par exemple, l'exécution de certaines instructions DDL (telles que la procédure de création ) en mode strict peut être restreinte.
Suggestion: assurez-vous que toutes les instructions sont légales et utilisez $ mysqli-> Erreur pour dépanner si nécessaire.
Utilisez Error_Reporting (E_ALL) pour activer toutes les invites d'erreur.
Vérifiez $ mysqli-> errno et $ mysqli-> erreur pour les informations d'erreur détaillées.
Logging: écrivez chaque sortie de valeur et de sortie d'erreur Next_Result () dans le journal pour le dépannage facile.
Utilisez mysqli_more_results () pour déterminer s'il existe toujours un ensemble de résultats:
if ($mysqli->more_results()) {
$mysqli->next_result();
}
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders WHERE order_date > '2024-01-01'";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo "données: " . implode(", ", $row) . "<br>";
}
$result->free();
} else {
if ($mysqli->errno) {
echo "erreur: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "La requête initiale a échoué:" . $mysqli->error;
}