Frage

Ich versuche, meine PHP-Code auszuführen, der zwei MySQL-Abfragen über mysqli Anrufe und erhalten die Fehlermeldung „Befehle nicht synchron; Sie diesen Befehl nicht ausführen können jetzt“.

Hier ist der Code, den ich mit

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

Ich habe versucht, auf diese zu lesen, aber ich bin nicht sicher, was zu tun ist. Ich habe über speichere das Ergebnis und freies Ergebnis zu lesen, aber diese keinen Unterschied gemacht, wenn sie zu benutzen. Ich bin genau unsicher, welcher Punkt dieser Fehler verursacht wird, und würde gerne wissen, warum es verursacht wird, und wie man es beheben.

Going durch meine Debug-Anweisungen, die ersten, wenn Schleife für countQuery nicht einmal eingegeben wird, aufgrund eines Fehlers in meiner SQL-Syntax in der Nähe in der Nähe von '% ? %'. Allerdings, wenn ich auf einer LIKE-Klausel zu beschränken, zu versuchen, nur * wählen stattdessen basiert, bekomme ich immer noch den Befehl aus Synchronisierungsfehler.

War es hilfreich?

Lösung

Sie können nicht zwei gleichzeitige Abfragen, weil Mysqli ungepufferten Abfragen standardmäßig verwendet (für vorbereitete Anweisungen, es ist das Gegenteil für Vanille mysql_query). Sie können entweder die ersten in eine Anordnung und eine Schleife durch die holen, oder sagen Mysqli die Abfragen-Puffer (unter Verwendung von $stmt->store_result() ).

Siehe hier .

Andere Tipps

Ich löste dieses Problem in meiner C-Anwendung - hier ist, wie ich es getan hätte:

  1. Zitiert von mysql-Foren:

      

    Dieser Fehler tritt, wenn Sie beenden Sie Ihre Abfrage mit einem Semikolon Trennzeichen innerhalb der Anwendung . Während es erforderlich ist, eine Abfrage mit einem Semikolon Trennzeichen zu beenden, wenn es von der Kommandozeile oder in dem Abfrage-Browser, entfernen Sie das Trennzeichen aus der Abfrage in Ihrer Anwendung ausgeführt wird.

  2. Nach meiner Abfrage ausgeführt und mit den Ergebnissen zu tun [C API: mysql_store_result()], iterieren ich über alle weiteren potenziell ausstehenden Ergebnisse, die ohne Behandlung sichern über mehr SQL-Anweisung der Ausführung wie zwei oder mehr SELECT-Anweisungen (zurück kommt mit den Ergebnissen).

    Die Tatsache ist, dass mein Verfahren nicht zurück mehrere Ergebnisse, aber die Datenbank nicht weiß, dass, bis ich ausführen: [C API: mysql_next_result()]. Ich tue dies in einer Schleife (für eine gute Maßnahme), bis er nicht Null zurückkehrt. Das ist, wenn der aktuelle Verbindung Handler weiß ist es in Ordnung, eine andere Abfrage (I-Cache meines Handler Verbindung Overhead zu minimieren) auszuführen.

    Dies ist die Schleife ich benutze:

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

Ich weiß nicht, PHP, aber ich bin sicher, dass es etwas ähnliches hat.

Ich hatte heute das gleiche Problem, aber nur, wenn sie mit einer gespeicherten Prozedur zu arbeiten. Dies machen die Abfrage wie eine Multi-Abfrage verhalten, so müssen Sie „verbrauchen“ andere Ergebnisse zur Verfügung, bevor eine weitere Abfrage machen.

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

ich diese Funktion vor jedem Aufruf $ mysqli- mit> query Arbeitet mit gespeicherten Prozeduren als auch.

function clearStoredResults(){
    global $mysqli;

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

}

I CodeIgniter verwenden. Ein Server OK ... dieses wahrscheinlich älter ... Auf jeden Fall mit

$this->db->reconnect();

es behoben.

Das Problem ist die MySQL-Client-C-Bibliothek, die die meisten MySQL-APIs auf gebaut werden. Das Problem ist, dass die C-Bibliothek nicht die gleichzeitige Ausführung von Abfragen nicht unterstützt, so dass alle eingebauten APIs oben auf das tun auch nicht. Auch wenn Sie ungepufferten Abfragen verwenden. Dies ist ein Grund, warum die asynchrone MySQL API geschrieben wurde. Sie kommuniziert direkt mit dem MySQL-Server unter Verwendung von TCP und das Draht-Protokoll hat gleichzeitige Abfragen unterstützen.

Ihre Lösung ist, um entweder den Algorithmus zu modifizieren, so dass Sie sofort sowohl im Gang zu haben, nicht benötigen, oder sie ändern gepuffert Abfragen zu verwenden, die wahrscheinlich für ihre Existenz in der C-Bibliothek einer der ursprünglichen Gründe (die andere sind eine Art von Cursor zu liefern).

Dieses Problem, das Sie Ergebnisdaten zu speichern, zu lösen haben vor der Verwendung es

$numRecords->execute();

$numRecords->store_result();

Das ist alles

Für diejenigen, die die bisherigen Antworten nicht helfen ... hier ist das, was mein Problem war !!!

die param Bindung „dynamisch“ war so hatte ich eine Variable, die die params der Daten setzt, um zu verwenden, bind_param . So dass Variable falsch war, sondern einen Fehler wie „falsch param Daten“ zu werfen, sagt sie „out of sync bla bla bla“ so war ich verwirrt ...

Ich hoffe, es half jemand!

Wenn Sie verwenden

stmt->execute();

Sie müssen es schließen eine weitere Abfrage zu verwenden.

stmt->close();

Dieses Problem wurde die Jagd mir stundenlang. Hoffentlich wird es Ihnen beheben.

Ich denke, das Problem ist, dass Sie eine neue Verbindung in der Funktion machen, und dann nicht am Ende zu schließen. Warum gehst du nicht vorbei versuchen, in die bestehende Verbindung und Wiederverwenden es?

Eine andere Möglichkeit ist, dass man aus der Mitte einer while-Schleife fetching sind zurück. Man kann nie vollständig, dass äußere holen.

Überprüfen Sie, ob Sie alle Parameter korrekt eingeben. Es führt den gleichen Fehler, wenn die Menge von Parametern definiert und dann an die Funktion übergeben ist unterschiedlich.

Dies ist nicht auf die ursprüngliche Frage bezogen, aber ich hatte die gleiche Fehlermeldung und dieser Thread ist der erste Treffer in Google und es dauerte eine Weile, um herauszufinden, was das Problem war, so kann es von Nutzen sein für andere:

ich bin Mysqli nicht verwenden, noch mysql_connect mit Ich hatte ein paar einfache querys, aber eine Abfrage verursacht alle anderen querys innerhalb derselben Verbindung zum Scheitern verurteilt.

Ich verwende MySQL 5.7 und PHP 5.6 Ich hatte eine Tabelle mit dem Datentyp „JSON“. offensichtlich, meine PHP-Version nicht erkannt, den Rückgabewert von mysql (php wußte einfach nicht, was mit dem JSON-Format zu tun, weil die eingebauten in mysql-Modul zu alt war (zumindest glaube ich))

für jetzt geändert ich den JSON-Feld-Typen in Text (wie jetzt ich brauche nicht die native mysql JSON-Funktionalität) und alles funktioniert

Wenn Sie entweder Buffered verwenden oder ungepufferte Ergebnismenge für Abrufen von Daten, müssen Sie zunächst einfach die abgerufenen Daten aus dem Speicher löschen, , sobald Sie haben alle Daten geholt . Wie Sie können nicht ein weiteres MYSQL Verfahren auf derselben Verbindung ausgeführt werden, bis Sie den abgerufenen Speicher zu löschen. Fügen Sie diese unten Funktion rechten Ende des Skripts, so wird es das Problem lösen

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

Referenz der PHP-Dokumentation

Ich lief in diesen Fehler mit Lehre DBAL Querybuilder.

Ich habe eine Abfrage mit Querybuilder, die Spalte Subselects verwendet, auch mit Querybuilder erstellt. Die Subselects wurden nur über $queryBuilder->getSQL() erstellt und nicht ausgeführt. Der Fehler trat auf den zweiten subselect zu schaffen. Durch vorläufig jede subselect mit $queryBuilder->execute() Ausführung vor $queryBuilder->getSQL() verwenden, funktionierte alles. Es ist, als ob die Verbindung $queryBuilder->connection in einem ungültigen Zustand bleibt auf jedem subselect eine neue SQL zum Erstellen, bevor die derzeit vorbereitet SQL trotz der neuen Querybuilder-Instanz ausgeführt wird.

war meine Lösung der Subselects ohne Querybuilder zu schreiben.

Mein Problem war, dass ich mit erster Anweisung vorzubereiten und dann wurde ich Mysqli Abfrage auf der gleichen Seite mit und wurde immer die Fehlermeldung „out of sync-Befehle; Sie diesen Befehl nicht ausführen können jetzt“. Der Fehler war nur dann, wenn ich den Code wurde mit der Anweisung vorzubereiten hatte.

Was ich tat, war die Frage zu schließen. und es hat funktioniert.

mysqli_stmt_close ($ stmt);

Mein Code

get_category.php (hier mit vorbereiten Anweisung)

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

Etwas, das nur fiel mir ein, ich auch wieder bin Hinzufügen von Verbindungsvariable über global $ Verbindung ;. Deshalb denke ich, im Grunde eine ganze Reihe neuer Abfragesystem gestartet wird nach der Vorbereitung Anweisung mit mysqli_stmt_close ($ stmt) endet; und bin auch das Hinzufügen ich diese Dateien und andere Sachen über include

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top