Maison  >  Article  >  base de données  >  Erreur PHP MySQLi « Commandes non synchronisées » : comment y remédier ?

Erreur PHP MySQLi « Commandes non synchronisées » : comment y remédier ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-18 10:03:02920parcourir

PHP MySQLi

Erreur de commandes PHP désynchronisées : compréhension et résolution

Lors de l'exécution de plusieurs instructions préparées dans PHP/MySQLi, vous pouvez rencontrer l'erreur « Commandes désynchronisées ». Cela résulte d'une inadéquation entre le nombre d'instructions exécutées et le nombre de résultats en cours de traitement. Pour résoudre ce problème, envisagez les informations et solutions suivantes :

Cause de l'erreur

L'erreur « Désynchronisation » se produit lorsque le client MySQL reçoit plus de données que prévu pour une instruction particulière. Cela se produit lors de l'utilisation de mysqli::query avec l'indicateur MYSQLI_USE_RESULT. Cet indicateur indique à MySQL de ne pas mettre complètement les résultats en mémoire tampon, ce qui entraînerait une désynchronisation des commandes suivantes.

Explication de l'extrait de code

Dans le code fourni, deux instructions préparées sont utilisées pour récupérer les données du base de données. La première instruction récupère les informations utilisateur, tandis que la seconde récupère les privilèges. Cependant, vous rencontrez l'erreur lors de l'exécution de la deuxième instruction.

Résolution

Pour résoudre l'erreur, vous devez libérer les résultats de la première instruction avant d'exécuter la seconde. Ceci est réalisé en appelant la fonction mysqli_stmt->free_result(). De plus, l'appel de mysqli->next_result() après chaque requête garantit que tous les résultats supplémentaires ont été traités.

Voici un exemple de la façon de résoudre le problème :

    $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();
    $mysqli->next_result(); // Ensure no stray results are present

    $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();

Conseils supplémentaires

  • Utilisez des objets distincts pour chaque instruction préparée afin d'éviter toute confusion.
  • Vérifiez toujours les erreurs après l'exécution d'une instruction à l'aide de mysqli_stmt->error.
  • Évitez d'utiliser MYSQLI_USE_RESULT à moins que nécessaire, car cela peut entraîner des problèmes de synchronisation.

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