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

StackOverflow https://stackoverflow.com/questions/614671

  •  03-07-2019
  •  | 
  •  

Question

J'essaie d'exécuter mon code PHP, qui appelle deux requêtes MySQL via mysqli, et génère l'erreur & "; Commandes désynchronisées; vous ne pouvez pas exécuter cette commande maintenant! & ";

Voici 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 lire à ce sujet, mais je ne sais pas quoi faire. J'ai lu des articles sur les résultats en magasin et les résultats gratuits, mais ils ne font aucune différence lors de leur utilisation. Je ne sais pas exactement à quel moment cette erreur est causée et je voudrais savoir pourquoi et comment la réparer.

En passant par mes instructions de débogage, la première boucle if pour countQuery n’est même pas entrée, en raison d’une erreur dans ma syntaxe SQL proche de '% ? %'. Toutefois, si je ne sélectionnais que * au lieu d'essayer de limiter en fonction d'une clause LIKE, j'obtiendrais quand même la commande hors erreur de synchronisation.

Était-ce utile?

La solution

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 tampon (en utilisant $stmt->store_result() ).

Voir ici pour plus de détails.

Autres conseils

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

  1. Citant des forums mysql:

      

    Cette erreur survient lorsque vous mettez fin à votre requête avec un séparateur de point-virgule dans l'application . Bien qu'il soit nécessaire de mettre fin à une requête avec un séparateur point-virgule lors de son exécution à partir de la ligne de commande ou du navigateur de requêtes, supprimez le délimiteur de la requête dans votre application.

  2. Après avoir exécuté ma requête et traité les résultats [API C: mysql_store_result()], je répète tous les résultats potentiellement en attente générés via l'exécution de plusieurs instructions SQL, telles que deux ou plusieurs instructions de sélection (dos à dos). sans traiter les résultats).

    Le fait est que mes procédures ne renvoient pas plusieurs résultats, mais que la base de données ne le sait pas avant l'exécution: [C API: mysql_next_result()]. Je fais cela dans une boucle (pour faire bonne mesure) jusqu'à ce qu'il retourne différent de zéro. C'est à ce moment que le gestionnaire de connexion actuel sait qu'il est correct d'exécuter une autre requête (je mets en cache mes gestionnaires pour réduire le temps système nécessaire à la connexion).

    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.

J'ai eu le même problème aujourd'hui, mais uniquement lorsque je travaillais avec une procédure stockée. Cela fait que la requête se comporte comme une requête multiple, vous devez donc & "Consommer &"; autres résultats disponibles avant de faire une autre requête.

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}

J'appelle cette fonction à chaque fois avant d'utiliser $ mysqli - > query Fonctionne également avec les procédures stockées.

function clearStoredResults(){
    global $mysqli;

    do {
         if ($res = $mysqli->store_result()) {
           $res->free();
         }
        } while ($mysqli->more_results() && $mysqli->next_result());        

}

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

$this->db->reconnect();

Le fixe.

Le problème vient de la bibliothèque C client MySQL, sur laquelle sont construites la plupart des API MySQL. Le problème est que la bibliothèque C ne prend pas en charge l'exécution simultanée de requêtes, donc toutes les API construites au-dessus ne le sont pas non plus. Même si vous utilisez des requêtes sans mémoire tampon. C'est l'une des raisons pour lesquelles l'API MySQL asynchrone a été écrite. Il communique directement avec le serveur MySQL via TCP et le protocole filaire prend en charge les requêtes simultanées.

Votre solution consiste à modifier l’algorithme afin de ne pas avoir les deux en cours en même temps, ou de les changer pour utiliser des requêtes en mémoire tampon, ce qui est probablement l’une des raisons originales de leur existence dans la bibliothèque C (la l’autre consiste à fournir une sorte de curseur).

pour résoudre ce problème, vous devez stocker les résultats avant de les utiliser

$numRecords->execute();

$numRecords->store_result();

c'est tout

Pour ceux que les réponses précédentes n’ont pas aidé ... voici ce qui était MON PROBLÈME !!!

la liaison param était & "dynamique &"; j'avais donc une variable qui définit les paramètres des données afin d'utiliser bind_param . Donc, cette variable était fausse, mais au lieu de générer une erreur comme & "Données de paramétrage erronées &"; il dit & "; désynchronisé bla bla bla &"; donc j'étais confus ...

J'espère que ça a aidé quelqu'un!

Une fois que vous avez utilisé

stmt->execute();

Vous devez le fermer pour utiliser une autre requête.

stmt->close();

Ce problème me poursuivait pendant des heures. Espérons que cela corrigera le vôtre.

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 extraction externe.

Vérifiez si vous saisissez tous les paramètres correctement. La même erreur est générée si le nombre de paramètres définis, puis transmis à la fonction, est différent.

Cela n’est pas lié à la question initiale, mais j’avais le même message d’erreur et ce fil est le premier succès de Google. Il m’a fallu un certain temps pour comprendre quel était le problème. C’est donc utile pour autres:

Je n'utilise PAS mysqli, j'utilise toujours mysql_connect J'avais des requêtes simples, mais UNE requête entraînait l'échec de toutes les autres requêtes au sein de la même connexion.

J'utilise mysql 5.7 et php 5.6 J'avais une table avec le type de données & "JSON &"; évidemment, ma version php ne reconnaissait pas la valeur de retour de mysql (php ne savait simplement pas quoi faire avec le format JSON car le module mysql intégré était trop ancien (du moins, je pense))

pour l'instant, j'ai changé le type de champ JSON en texte (pour l'instant, je n'ai pas besoin de la fonctionnalité JSON mysql native) et tout fonctionne correctement

Si vous utilisez le jeu de résultats Buffered ou Unbuffered pour extraire des données, vous devez d'abord effacer les données extraites de la mémoire, une fois que vous avez extrait toutes les données . Comme vous ne pouvez pas exécuter une autre procédure MYSQL sur la même connexion jusqu'à ce que vous effaciez la mémoire extraite. Ajoutez la fonction ci-dessous à l'extrémité droite de votre script pour résoudre le problème

.
$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch

Référence de la documentation PHP

J'ai rencontré cette erreur avec Doctrine DBAL QueryBuilder.

J'ai créé une requête avec QueryBuilder qui utilise des sous-colonnes de colonnes, également créées avec QueryBuilder. Les sous-sélections ont été créées uniquement via $queryBuilder->getSQL() et non exécutées. L'erreur s'est produite lors de la création de la deuxième sous-sélection. En exécutant provisoirement chaque sous-sélection avec $queryBuilder->execute() avant d'utiliser $queryBuilder->connection, tout a fonctionné. C'est comme si la connexion <=> restait dans un état non valide pour la création d'un nouveau SQL avant d'exécuter le SQL actuellement préparé, malgré la nouvelle instance de QueryBuilder sur chaque sous-sélection.

Ma solution consistait à écrire les sous-sélections sans QueryBuilder.

Mon problème était que j'utilisais la première instruction de préparation, puis la requête mysqli sur la même page et que le message d'erreur & "; Commandes non synchronisées; vous ne pouvez pas exécuter cette commande maintenant " ;. L'erreur était alors seulement quand j'utilisais le code qui avait une instruction prepare.

Ce que j'ai fait était de clore la question. et cela a fonctionné.

mysqli_stmt_close ($ stmt);

Mon code

get_category.php (ici en utilisant une instruction prepare)

    <?php


    global $connection;
    $cat_to_delete =    mysqli_real_escape_string($connection, $_GET['get'] );

    $sql = "SELECT category_name FROM categories WHERE category_id = ? ;";


    $stmt = mysqli_stmt_init($connection);

    if (!mysqli_stmt_prepare($stmt, $sql))
        $_SESSION['error'] = "Error at preaparing for deleting query. mysqli_stmt_error($stmt) ." & redirect('../error.php');

    mysqli_stmt_bind_param($stmt, 's', $cat_to_delete);

    if (!mysqli_stmt_execute($stmt))
        $_SESSION['error'] = "ERror at executing delete category ".mysqli_stmt_error($stmt) &
            redirect('../error.php');


    mysqli_stmt_bind_result($stmt, $cat_name);

    if (!mysqli_stmt_fetch($stmt)) {
        mysqli_stmt_error($stmt);
    }



    mysqli_stmt_free_result($stmt);
    mysqli_stmt_close($stmt);

admin_get_category_body.php (ici mysqli)

        <?php

        if (isset($_GET['get']) && !empty($_GET['get']) )
        {
            include 'intodb/edit_category.php';
        }


        if (check_method('get') && isset($_GET['delete']) )
        {
            require 'intodb/delete_category.php';
        }


        if (check_method('get') && isset($_GET['get']) )
        {
            require 'intodb/get_category.php';
        }


        ?>

        <!--            start: cat body          -->

        <div     class="columns is-mobile is-centered is-vcentered">
            <div class="column is-half">
                <div   class="section has-background-white-ter box ">


                    <div class="has-text-centered column    " >
                        <h4 class="title is-4">Ctegories</h4>
                    </div>

                    <div class="column " >


                        <?php if (check_method('get') && isset($_GET['get'])) {?>
                        <form action="" method="post">
                            <?php } else {?>
                            <form action="intodb/add_category.php" method="post">
                                <?php } ?>

                                <label class="label" for="admin_add_category_bar">Add Category</label>
                                <div class="field is-grouped">

                                    <p class="control is-expanded">

                                        <?php if (check_method('get') && isset($_GET['get'])) {?>

                                            <input id="admin_add_category_bar" name="admin_add_category_bar_edit" class="input" type="text" placeholder="Add Your Category Here" value="<?php echo $cat_name; ?>">

                                            <?php


                                            ?>
                                        <?php } else {?>
                                            <input id="admin_add_category_bar" name="admin_add_category_bar" class="input" type="text" placeholder="Add Your Category Here">

                                        <?php } ?>
                                    </p>
                                    <p class="control">
                                        <input type="submit" name="admin_add_category_submit" class="button is-info my_fucking_hover_right_arrow" value="Add Category">
                                    </p>
                                </div>
                            </form>


                            <div class="">

                                <!--            start: body for all posts inside admin          -->


                                <table class="table is-bordered">
                                    <thead>
                                    <tr>
                                        <th><p>Category Name</p></th>
                                        <th><p>Edit</p></th>
                                        <th><p>Delete</p></th>
                                    </tr>
                                    </thead>

                                    <?php

                                    global $connection;
                                    $sql = "SELECT * FROM categories ;";

                                    $result = mysqli_query($connection, $sql);
                                    if (!$result) {
                                        echo mysqli_error($connection);
                                    }
                                    while($row = mysqli_fetch_assoc($result))
                                    {
                                        ?>
                                        <tbody>
                                        <tr>
                                            <td><p><?php echo $row['category_name']?></p></td>
                                            <td>
                                                <a href="admin_category.php?get=<?php echo $row['category_id']; ?>" class="button is-info my_fucking_hover_right_arrow" >Edit</a>

                                            </td>

                                            <td>
                                                <a href="admin_category.php?delete=<?php echo $row['category_id']; ?>" class="button is-danger my_fucking_hover_right_arrow" >Delete</a>

                                            </td>
                                        </tr>


                                        </tbody>
                                    <?php }?>
                                </table>

                                <!--           end: body for all posts inside admin             -->




                            </div>

                    </div>
                </div>


            </div>

        </div>
        </div>

Quelque chose qui me vient à l’esprit, j’ajoute de nouveau une variable de connexion via Global $ connection ;. Donc, je pense que fondamentalement, un tout nouvel ensemble de système de requête est démarré après la fin de l'instruction de préparation avec mysqli_stmt_close ($ stmt); et aussi j'ajoute ces fichiers et d'autres choses via include

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top