Opdrachten lopen niet synchroon; je kunt deze opdracht nu niet uitvoeren

Ik probeer mijn PHP-code uit te voeren, die twee MySQL-query’s via mysqli aanroept, en krijg de foutmelding “Commands out of sync; you can’t run this command now”.

Hier is de code die ik gebruik

<?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;
        }
    }
}

Ik heb geprobeerd hier meer over te lezen, maar ik weet niet wat ik moet doen. Ik heb gelezen over winkelresultaat en gratis resultaat, maar deze hebben geen verschil gemaakt bij het gebruik ervan. Ik weet niet precies op welk punt deze fout wordt veroorzaakt en zou graag willen weten waarom deze wordt veroorzaakt en hoe ik deze kan oplossen.

Afgaande op mijn debug-instructies, wordt de eerste if-lus voor countQuery niet eens ingevoerd, vanwege een fout in mijn sql-syntaxis in de buurt van '% ? %'. Als ik echter gewoon *selecteer in plaats van te proberen te beperken op basis van een LIKE-clausule, krijg ik nog steeds de foutmelding dat de opdracht niet synchroon loopt.


Antwoord 1, autoriteit 100%

Je kunt geen twee gelijktijdige zoekopdrachten hebben omdat mysqli standaard niet-gebufferde zoekopdrachten gebruikt (voor voorbereide instructies; het tegenovergestelde voor vanilla mysql_query). Je kunt ofwel de eerste in een array halen en daar doorheen lopen, of mysqli vertellen om de queries te bufferen (met behulp van $stmt->store_result()).

Zie hiervoor details.


Antwoord 2, autoriteit 31%

Ik heb dit probleem opgelost in mijn C-toepassing – hier is hoe ik het deed:

  1. Citaat uit mysql-forums:

    Deze fout treedt op wanneer u uw zoekopdracht beëindigt met een scheidingsteken met puntkomma’s in de toepassing. Hoewel het vereist is om een query te beëindigen met een scheidingsteken door puntkomma’s wanneer deze wordt uitgevoerd vanaf de opdrachtregel of in de querybrowser, verwijdert u het scheidingsteken uit de query in uw toepassing.

  2. Na het uitvoeren van mijn query en het afhandelen van de resultaten [C API: mysql_store_result()], herhaal ik alle andere mogelijk wachtende resultaten die plaatsvinden via meerdere uitvoeringen van SQL-instructies, zoals twee of meer selecte uitspraken (rug aan rug zonder de resultaten te behandelen).

    Het feit is dat mijn procedures niet meerdere resultaten retourneren, maar de database weet dat niet totdat ik het volgende uitvoer: [C API: mysql_next_result()]. Ik doe dit in een lus (voor de goede orde) totdat het niet-nul retourneert. Dat is wanneer de huidige verbindingshandler weet dat het goed is om nog een query uit te voeren (ik cache mijn handlers om de verbindingsoverhead te minimaliseren).

    Dit is de lus die ik gebruik:

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

Ik ken PHP niet, maar ik weet zeker dat het iets soortgelijks heeft.


Antwoord 3, autoriteit 15%

Ik had vandaag hetzelfde probleem, maar alleen bij het werken met een opgeslagen procedure. Hierdoor gedraagt de query zich als een multi-query, dus u moet andere beschikbare resultaten “consumeren” voordat u een nieuwe query maakt.

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

Antwoord 4, autoriteit 9%

Ik roep deze functie elke keer aan voordat ik $mysqli->query gebruik
Werkt ook met opgeslagen procedures.

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

Antwoord 5, autoriteit 6%

Zodra je

. hebt gebruikt

stmt->execute();

U MAIsluit het om een andere zoekopdracht te gebruiken.

stmt->close();

Dit probleem was al uren op me aan het jagen. Hopelijk lost het de jouwe op.


Antwoord 6, autoriteit 4%

Ik gebruik CodeIgniter.
Eén server OK … deze waarschijnlijk ouder …
Hoe dan ook met

$this->db->reconnect();

Opgelost.


Antwoord 7

Het probleem is de MySQL-client C-bibliotheek, waarop de meeste MySQL-API’s zijn gebouwd. Het probleem is dat de C-bibliotheek geen ondersteuning biedt voor gelijktijdige uitvoering van query’s, dus alle API’s die daarop zijn gebouwd, doen dat ook niet. Zelfs als u niet-gebufferde query’s gebruikt. Dit is een van de redenen waarom de asynchrone MySQL API is geschreven. Het communiceert rechtstreeks met de MySQL-server via TCP en het wire-protocol ondersteuntgelijktijdige zoekopdrachten.

Uw oplossing is om ofwel het algoritme aan te passen, zodat u niet beide tegelijk hoeft te hebben, of ze te wijzigen om gebufferde zoekopdrachten te gebruiken, wat waarschijnlijk een van de oorspronkelijke redenen is voor hun bestaan in de C-bibliotheek (de andere is om een soort cursor te geven).


Antwoord 8

om dit probleem op te lossen, moet u resultaatgegevens opslaan voordat u het gebruikt

$numRecords->execute();
$numRecords->store_result();

dat is alles


Antwoord 9

Andere oorzaak: store_result() kan niet twee keer worden aangeroepen.

In de volgende code wordt bijvoorbeeld Error 5 afgedrukt.

<?php
$db = new mysqli("localhost", "something", "something", "something");
$stmt = $db->stmt_init();
if ($stmt->error) printf("Error 1 : %s\n", $stmt->error);
$stmt->prepare("select 1");
if ($stmt->error) printf("Error 2 : %s\n", $stmt->error);
$stmt->execute();
if ($stmt->error) printf("Error 3 : %s\n", $stmt->error);
$stmt->store_result();
if ($stmt->error) printf("Error 4 : %s\n", $stmt->error);
$stmt->store_result();
if ($stmt->error) printf("Error 5 : %s\n", $stmt->error);

(Dit is misschien niet relevant voor de originele voorbeeldcode, maar het kan relevant zijn voor mensen die antwoorden op deze fout zoeken.)


Antwoord 10

Dit is wat MIJN PROBLEEM was!!!

De parambinding was “dynamisch”, dus ik had een variabele die de parameters van de gegevens instelt om bind_paramte gebruiken. Dus die variabele was verkeerd, maar in plaats van een fout zoals “verkeerde paramgegevens” te geven, staat er “niet synchroon bla bla bla”, dus ik was in de war…


Antwoord 11

Ik denk dat het probleem is dat je een nieuwe verbinding maakt in de functie en deze vervolgens niet sluit. Waarom probeer je de bestaande verbinding niet door te geven en opnieuw te gebruiken?

Een andere mogelijkheid is dat je terugkomt uit het midden van een while-lus ophalen. Je voltooit die buitenste ophaalactie nooit.


Antwoord 12

Controleer of u alle parameters correct typt. Het geeft dezelfde fout als het aantal gedefinieerde parameters en vervolgens doorgegeven aan de functie verschillend is.


Antwoord 13

Dit is niet gerelateerd aan de oorspronkelijke vraag, maar ik had dezelfde foutmelding en deze thread is de eerste hit in Google en het kostte me een tijdje om erachter te komen wat het probleem was, dus het kan van pas komen voor anderen:

ik gebruik GEEN mysqli, ik gebruik nog steeds mysql_connect
ik had een paar simpele vragen, maar ÉÉN zoekopdracht zorgde ervoor dat alle andere zoekopdrachten mislukten binnen dezelfde verbinding.

Ik gebruik mysql 5.7 en php 5.6
ik had een tabel met het gegevenstype “JSON”. uiteraard herkende mijn php-versie de retourwaarde van mysql niet (php wist gewoon niet wat te doen met het JSON-formaat omdat de ingebouwde mysql-module te oud was (althans ik denk))

voor nu heb ik het JSON-Field-Type gewijzigd in Text (voor nu heb ik de native mysql JSON-functionaliteit niet nodig) en alles werkt prima


Antwoord 14

Ik kwam deze fout tegen met Doctrine DBAL QueryBuilder.

Ik heb een query gemaakt met querybuilder die kolom Subselect gebruikt, ook gemaakt met querybuilder. De subselect werden alleen gemaakt via $queryBuilder->getSQL()en niet uitgevoerd. De fout gebeurde op het maken van de tweede subsect. Door voorlopig elk subselect te voeren met $queryBuilder->execute()uit voordat u $queryBuilder->getSQL()gebruikt, alles werkte. Het is alsof de verbinding $queryBuilder->connectionblijft in een ongeldige status voor het maken van een nieuwe SQL voordat u de momenteel voorbereide SQL uitvoert, ondanks het nieuwe querybuilder-instantie op elke subsect.

Mijn oplossing was om de subselect te schrijven zonder querybuilder.


Antwoord 15

Ik gebruik ODBC, en deze fix werkt voor mij:
ODBC – & GT; Tabsysteem DSN – & GT; Dubbelklik om mijn gegevensbron – & GT te configureren; Details – & GT; Tabcursors – & GT; Schakel uit [Cache-resultaten van forward-only Cursors] – & GT; Klik op OK


Antwoord 16

Ik heb deze fout vaak geraakt en het is altijd wanneer ik een opgeslagen procedure uitvoer die ik ben debuggen in PHPMYADMIN of SQL Workbench (ik werk in PHP-verbinding met MySQLI).

De foutresultaten van het feit dat het debugging in het invoegen van selectieve verklaringen in de code in de code instellen om me de staat van variabelen te vertellen, enz. Het uitvoeren van een opgeslagen procedure die meerdere resultatensets in deze client-omgevingen produceert, is prima, maar het Produceert de foutmelding “opdrachten uit synchronisatie” wanneer het wordt gebeld van PHP. De oplossing is altijd om comment-out of verwijder de foutopsporingsels, zodat de procedure slechts één resultaat is ingesteld.


Antwoord 17

Alleen voor referentie had ik dit probleem met het mengen van zowel multi_queryen queryin dezelfde code:

$connection->multi_query($query);
...
$connection->query($otherQuery);

Waarvoor wat ik las nog niet-geconsumeerde resultaten in behandeling had, waardoor de genoemde fout werd veroorzaakt.

Ik heb het opgelost met een lus die alle resultaten van de multi_queryverbruikt:

$connection->multi_query($query);
while ($connection->next_result()); // <--- solves the problem
...
$connection->query($otherQuery);

In mijn geval werden alle zoekopdrachten in de multi_queryingevoegd, dus ik had geen interesse in de resultaten zelf.


Antwoord 18

Om het referentiegeheugen te wissen en de volgende MYSQL-ophaalactie uit te voeren

Als je de resultatenset Bufferedof Unbufferedgebruikt voor het ophalen van gegevens, moet je eerst de opgehaalde gegevens uit het geheugen wissen, nadat je alle gegevens hebt opgehaald. de gegevens. Omdat u geen andere MYSQL-procedure op dezelfde verbinding kunt uitvoeren totdat u het opgehaalde geheugen wist.

Voeg deze functie toe aan de rechterkant van je script, zodat het het probleem oplost

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

Referentie uit de PHP-documentatie


Antwoord 19

Mijn probleem was dat ik de eerste voorbereidingsverklaring gebruikte en vervolgens de mysqli-query op dezelfde pagina gebruikte en de foutmelding kreeg “Opdrachten lopen niet synchroon; u kunt deze opdracht nu niet uitvoeren”. De fout was pas toen ik de code gebruikte die een verklaring had voorbereid.

Wat ik deed, was de vraag sluiten. en het werkte.

mysqli_stmt_close($stmt);

Mijn code

get_category.php (hier gebruik je de voorbereidingsverklaring )

   <?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 (hier 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>

iets dat net mijn geest heeft gekruist, ik ook weer aansluitingsvariabele toevoegen via wereldwijde $ aansluiting;. Dus ik denk dat er in feite een geheel nieuwe set query-systeem wordt gestart na het einde van het voorbereidende verklaring met MySQLI_STMT_CLOSE ($ STMT); En ik voeg ook deze bestanden en andere dingen toe via de volgende


Antwoord 20

Dit is een oude vraag, maar geen van de gepost antwoorden werkte in mijn geval, ik vond dat ik in mijn geval een tabel in mijn opgeslagen procedure had geselecteerd en bijgewerkt en bijgewerkt in mijn opgeslagen procedure, dezelfde tabel had een update-trigger die werd geactiveerd en het afdekken van de procedure in een oneindige lus. Zodra de bug werd gevonden, ging de fout weg.


Antwoord 21

Maak twee verbindingen, gebruik beide afzonderlijk

$mysqli = new mysqli("localhost", "Admin", "dilhdk", "SMS");
$conn = new mysqli("localhost", "Admin", "dilhdk", "SMS"); 

Other episodes