Lorsque vous utilisez des extensions MySQLI pour les opérations de base de données en PHP, nous devons souvent utiliser MySQLI_STMT :: FREE_RESULT () pour libérer l'ensemble de résultats d'exécution pour éviter les fuites de mémoire. Cependant, dans le développement réel, vous pouvez rencontrer le problème de MySQLI_STMT :: Free_Result Erreur "Aucun ensemble de résultats". Cet article analysera en détail les causes communes de ce problème et ses solutions.
mysqli_stmt :: free_result () est une méthode dans l'extension mysqli pour libérer le jeu de résultats de requête. Habituellement, après l'exécution d'une requête sélectionnée, si le jeu de résultats n'est plus nécessaire, appeler cette méthode peut libérer la mémoire et réduire la consommation de ressources.
Par exemple:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result(); // Stocker les résultats
// Le traitement des données peut être effectué pour le moment...
$stmt->free_result(); // Libérez l'ensemble de résultats
L'erreur "Aucun ensemble de résultats" se produit généralement lorsque Free_Result () est appelée, le programme n'effectue pas une opération de requête ou que la requête ne renvoie pas le jeu de résultats. Plus précisément, l'erreur signifie: la méthode Free_Result () essaie de libérer un ensemble de résultats qui n'existe pas.
Déliachance de type de requête :
Si une requête de type non sélectionné est exécutée (telles que l'insertion, la mise à jour, la suppression, etc.), ces requêtes ne produisent pas de jeu de résultats, donc appeler free_result () provoquera cette erreur.
Solution :
Assurez-vous que Free_Result () est appelé uniquement après la requête sélectionnée.
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$stmt->execute();
// N'appelle pas free_result(),Parce qu'il n'y a pas de jeu de résultats
Store_result () ou bind_result () n'est pas appelé :
Une fois la requête de sélection exécutée, le jeu de résultats ne sera généré que si store_result () ou bind_result () est appelé. Si Free_Result () est appelé sans générer un ensemble de résultats, une erreur sera signalée.
Solution :
Avant d'appeler Free_Result () , assurez-vous que Store_Result () ou bind_result () a été appelé.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result(); // Assurez-vous que l'ensemble de résultats est stocké
$stmt->free_result(); // Maintenant sûr à appeler
La requête n'a pas été exécutée avec succès :
Si la requête SQL n'est pas exécutée avec succès pour une raison quelconque (telles que les erreurs de syntaxe, les problèmes de connexion, etc.), il n'y a aucun résultat à retourner et une erreur sera signalée lors de l'appel Free_Result () .
Solution :
Assurez-vous que la requête SQL est exécutée avec succès, puis appelez Free_Result () . Ce problème peut être évité en vérifiant si la requête a été exécutée avec succès.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
if ($stmt === false) {
die('MySQL prepare failed: ' . $mysqli->error);
}
$stmt->bind_param("i", $userId);
$stmt->execute();
if ($stmt->affected_rows > 0) {
$stmt->store_result();
$stmt->free_result();
}
Déclaration étroite à l'avance :
Si l'instruction de requête est fermée à l'avance ( $ stmt-> close () ) avant d'exécuter la requête et de stocker les résultats, cela rendra le résultat de la requête inaccessible et une erreur se produira lors de l'appel Free_Result () .
Solution :
Assurez-vous de fermer l'instruction après avoir terminé le traitement de la requête.
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result(); // 必须先Stocker les résultats
$stmt->free_result(); // Ensuite, les résultats peuvent être publiés
$stmt->close(); // Dernière déclaration étroite
La requête renvoie un ensemble de résultats vide :
Si la requête de sélection ne renvoie aucun résultat (par exemple, les conditions de requête ne correspondent pas), l'appel Free_Result () ne rapportera généralement pas une erreur, mais un comportement incohérent peut se produire dans certaines configurations ou environnements. Bien que ce ne soit pas la cause directe d'une erreur, cela peut parfois causer d'autres problèmes inattendus.
Solution :
Vérifiez si la requête renvoie les données avant d'appeler Free_Result () .
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Il y a des résultats
$stmt->free_result();
} else {
echo "Aucun résultat n'a été trouvé";
}
MySQLI_STMT :: FREE_RESULT ERROR "Aucun jeu de résultats" est généralement causé par la requête qui ne renvoie pas le jeu de résultats, ou free_result () est appelé sans appeler correctement store_result () ou bind_result () . Pour éviter de telles erreurs, les développeurs doivent prêter attention aux points suivants:
Assurez-vous que Free_Result () est appelé uniquement après la requête sélectionnée.
Assurez-vous d'exécuter store_result () ou bind_result () avant d'appeler free_result () .
Vérifiez si la requête SQL est exécutée avec succès.
Effectuez toutes les opérations avant de clôturer la déclaration.
Grâce aux méthodes et techniques ci-dessus, cette erreur peut être effectivement évitée et le fonctionnement de la base de données peut être assuré en douceur.