111 votes

Commandes désynchronisées; vous ne pouvez pas exécuter cette commande maintenant

Je suis en train d'exécuter mon code PHP, ce qui appelle deux requêtes MySQL via mysqli, et obtenez le message d'erreur "Commandes de synchronisation; vous ne pouvez pas exécuter cette commande maintenant".

Ici c'est le code que j'utilise

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("s", $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = $data->num_rows;
    $rows = getRowsByArticleSearch("test", "Auctions", " ");
    $last = ceil($rowcount/$page_rows);
}  else {

print_r($con->error);
}
foreach ($rows as $row) {
    $pk = $row['ARTICLE_NO'];
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
    echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
    echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
    $con = mysqli_connect("localhost", "user", "password", "db");
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("s", $searchString);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = $result->fetch_assoc()) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

J'ai essayé de faire des lectures sur ce sujet, mais je suis pas sûr de quoi faire. J'ai lu à propos de stocker le résultat et libre de suite, cependant, ils n'ont fait aucune différence lors de leur utilisation. Je ne sais pas exactement à quel point cette erreur est causée, et voudrais savoir pourquoi il est dû, et comment le résoudre.

En passant par mes instructions de débogage, le premier si la boucle pour countQuery n'est même pas entré en raison d'une erreur dans mon sql syntaxe près de près de '% ? %'. Cependant, si je viens de sélectionner * , au lieu de chercher à la limite fondée sur une clause LIKE, je reçois toujours la commande de l'erreur de synchronisation.

127voto

flussence Points 5870

Vous ne pouvez pas avoir deux requêtes simultanées car mysqli utilise par défaut des requêtes sans tampon (pour les instructions préparées, c'est l'inverse pour vanilla mysql_query ). Vous pouvez soit chercher le premier dans un tableau et le parcourir, soit dire à mysqli de mettre les requêtes en mémoire tampon (en utilisant $stmt->store_result() ).

Voir ici pour plus de détails.

40voto

tracy.brown Points 241

J'ai résolu ce problème dans mon application C - voici comment j'ai fait:

  1. Citant mysql forums:

    Cette erreur se produit lorsque vous résiliez votre requête avec un point-virgule séparateur à l'intérieur de l'application. Alors qu'il est tenu de mettre fin à une requête avec un point-virgule séparateur lors de l'exécution de la ligne de commande ou dans la requête du navigateur, supprimer le séparateur à partir de la requête à l'intérieur de votre application.

  2. Après l'exécution de ma requête et de traiter avec les résultats [de l'API C: mysql_store_result()], je itérer sur toutes les autres, potentiellement, dans l'attente des résultats qui se produit par le biais de multiples exécution de l'instruction SQL comme deux ou plusieurs instructions select (dos à dos sans traiter avec les résultats).

    Le fait est que mon procédures ne retourne pas de résultats multiples, mais la base de données ne sait pas que jusqu'à ce que j'execute: [API C: mysql_next_result()]. Je fais cela dans une boucle (pour faire bonne mesure) jusqu'à ce qu'elle renvoie zéro. C'est alors que l'actuel gestionnaire de connexion de la sait que c'est ok pour exécuter une autre requête (je cache mes gestionnaires afin de minimiser les connexions).

    C'est la boucle que j'utilise:

    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    

Je ne connais pas PHP, mais je suis sûr qu'il a quelque chose de similaire.

3voto

Norman Points 37

J'utilise CodeIgniter. Un serveur OK ... celui-ci probablement plus ancien ... Quoi qu'il en soit en utilisant

 $this->db->reconnect();
 

Fixe le.

1voto

staticsan Points 14435

Le problème, c'est le client MySQL C de la bibliothèque, dont la plupart des Api MySQL sont construits sur. Le problème est que la bibliothèque C ne prend pas en charge simultanée de l'exécution de requêtes, de sorte que toutes les Api intégré sur le dessus de cela aussi ne pas. Même si vous utilisez des barrettes de mémoire les requêtes. C'est une des raisons pourquoi l'asynchrone API MySQL a été écrit. Elle communique directement avec le serveur MySQL en utilisant le protocole TCP et le fil-protocole ne soutien de requêtes simultanées.

Votre solution c'est soit de modifier l'algorithme de sorte que vous n'avez pas besoin d'avoir les deux en cours à la fois, ou d'en changer, à utiliser en tampon de requêtes, ce qui est probablement une des raisons de leur existence dans la bibliothèque C (l'autre est de fournir une sorte de curseur).

0voto

Paul Tomblin Points 83687

Je pense que le problème est que vous établissez une nouvelle connexion dans la fonction et que vous ne la fermez pas à la fin. Pourquoi n'essayez-vous pas de transmettre la connexion existante et de la réutiliser?

Une autre possibilité est que vous reveniez au milieu d'une extraction de boucle while. Vous ne terminez jamais cette recherche externe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X