Maison >base de données >tutoriel mysql >Pourquoi est-ce que j'obtiens des erreurs « Commandes non synchronisées » lors de l'utilisation de plusieurs instructions préparées PHP MySQLi ?

Pourquoi est-ce que j'obtiens des erreurs « Commandes non synchronisées » lors de l'utilisation de plusieurs instructions préparées PHP MySQLi ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-21 07:32:11644parcourir

Why Do I Get

Commandes PHP désynchronisées : résolution de l'erreur lors de l'utilisation de plusieurs instructions préparées

En PHP, lors de la tentative d'exécution de plusieurs instructions préparées à l'aide de MySQLi , vous pouvez rencontrer l'erreur "Commandes désynchronisées, vous ne pouvez pas exécuter la commande maintenant." Cette erreur se produit en raison de la gestion par défaut par MySQLi des ensembles de résultats des requêtes.

Une cause potentielle de cette erreur est l'utilisation de MYSQLI_USE_RESULT lors de l'exécution de la requête. Ce mode optimise les performances en évitant la mise en mémoire tampon de l'ensemble des résultats. Cependant, cela nécessite que vous publiiez manuellement le résultat en utilisant mysqli_free_result(). Si vous ne le faites pas avant d'exécuter les instructions suivantes, la séquence de commandes devient désynchronisée.

Pour résoudre ce problème, assurez-vous d'appeler mysqli_free_result() après avoir récupéré toutes les lignes de chaque instruction. Alternativement, vous pouvez utiliser la méthode store_result() pour stocker l'ensemble des résultats en mémoire, vous permettant ainsi d'y accéder plus tard sans vous soucier des conflits potentiels.

Une autre cause courante de cette erreur est la présence de résultats en attente de une requête précédente. Lors de l'exécution de plusieurs requêtes dans une boucle, assurez-vous d'appeler mysqli_next_result() après avoir traité chaque jeu de résultats. Cette méthode libère tous les résultats restants et prépare la connexion pour les requêtes suivantes.

Voici un exemple de la façon de corriger l'erreur en appelant à la fois mysqli_free_result() et mysqli_next_result() :

$stmt = $mysqli->prepare("SELECT id, username, password, firstname, lastname, salt FROM members WHERE email = ? LIMIT 1");
$stmt->bind_param('s', $loweredEmail);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id, $username, $db_password, $firstname, $lastname, $salt);
$stmt->fetch();

$stmt->free_result();
$stmt->close();

while ($mysqli->more_results()) {
    $mysqli->next_result();
}

$stmt1 = $mysqli->prepare("SELECT privileges FROM delegations WHERE id = ? LIMIT 1");
$stmt1->bind_param('s', $user_id);
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($privileges);
$stmt1->fetch();

Par en gérant correctement les ensembles de résultats et en les publiant lorsqu'ils ne sont pas nécessaires, vous pouvez éviter l'erreur « Commandes désynchronisées » et assurer une exécution transparente de plusieurs instructions préparées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn