Maison >développement back-end >tutoriel php >Pourquoi est-ce que j'obtiens une erreur « Commandes non synchronisées » en PHP avec les requêtes MySQL ?

Pourquoi est-ce que j'obtiens une erreur « Commandes non synchronisées » en PHP avec les requêtes MySQL ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-19 21:28:16207parcourir

Why Do I Get a

Erreur « Commandes désynchronisées » dans le code PHP avec les requêtes MySQL

Lors de l'exécution d'un script PHP impliquant plusieurs requêtes MySQL à l'aide de mysqli, une erreur peut se produire : "Commandes désynchronisées ; vous ne pouvez pas exécuter cette commande maintenant." Ce problème survient lorsque des requêtes ultérieures sont tentées avant de récupérer et de traiter les résultats de la requête précédente ou de vider le cache des commandes de requête du serveur MySQL.

Le code fourni dans la question exécute deux requêtes : une pour compter les enregistrements et une autre. pour récupérer des lignes en fonction d'une chaîne de recherche. Cependant, avant que les résultats de la première requête ne soient récupérés, la deuxième requête est exécutée. Cela déclenche l'erreur « désynchronisation ».

Causes de l'erreur

  • Requêtes sans tampon : MySQLI utilise des requêtes sans tampon par défaut pour les instructions préparées, ce qui signifie que les résultats sont diffusés en parties au fur et à mesure qu'ils sont disponibles. Si une requête ultérieure est tentée avant de mettre en mémoire tampon les résultats de la première requête, les commandes peuvent devenir désynchronisées et entraîner l'erreur.
  • Exécution de requête incomplète : Lorsque plusieurs requêtes sont tentées sans gérer correctement le En conséquence, des commandes incomplètes peuvent s'accumuler dans le cache du serveur. Cela peut perturber les requêtes suivantes et provoquer l'erreur.

Solutions possibles

  • Résultats du tampon : Pour éviter cette erreur, utilisez $stmt->store_result() pour mettre en mémoire tampon les résultats de la requête avant d'exécuter la suivante. Récupérez les résultats mis en mémoire tampon à l'aide de $stmt->fetch(), puis effacez le cache du serveur avec $stmt->free_result().
  • Récupérer les premiers résultats de la requête : Vous pouvez également récupérer tous les résultats. résultats de la première requête dans un tableau. Cela consomme les résultats et permet d'exécuter les requêtes suivantes sans interférence des résultats non récupérés.
  • Utiliser les transactions : Si plusieurs requêtes sont liées et doivent être exécutées séquentiellement, envisagez d'utiliser des transactions pour gérer le processus. comme un seul atome unit.

Exemple

Voici un exemple de mise en mémoire tampon des résultats de la première requête à l'aide de $stmt->store_result() :

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
$con->query("SET NAMES 'utf8'");
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $numRecords->store_result(); // Buffer the results
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
}

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