Maison > base de données > tutoriel mysql > le corps du texte

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

Barbara Streisand
Libérer: 2024-11-18 10:03:02
original
919 Les gens l'ont consulté

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal