Ich versuche, meinen PHP-Code auszuführen, der zwei MySQL-Abfragen über mysqli aufruft, und erhalte die Fehlermeldung "Befehle nicht synchron; Sie können diesen Befehl jetzt nicht ausführen".
Hier ist der Code, den ich benutze
<?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, dies nachzulesen, bin mir aber nicht sicher, was ich tun soll. Ich habe über das Speicherergebnis und das kostenlose Ergebnis gelesen, aber diese haben bei der Verwendung keinen Unterschied gemacht. Ich bin mir nicht sicher, an welchem Punkt dieser Fehler verursacht wird, und möchte wissen, warum er verursacht wird und wie er behoben werden kann.
Nach meinen Debug-Anweisungen wird die erste if-Schleife für countQuery aufgrund eines Fehlers in meiner SQL-Syntax in der Nähe von nicht einmal eingegeben '% ? %'
. Wenn ich jedoch nur auswähle, *
anstatt zu versuchen, basierend auf einer LIKE-Klausel zu begrenzen, wird der Befehl immer noch nicht synchronisiert.
$stmt->store_result();
Ich denke, Ihre Antwort sollte dies klarer machen.$select_stmt->close();
, um sie aufzuteilen (nicht gleichzeitig, sondern prozeduralIch habe dieses Problem in meiner C-Anwendung gelöst - so habe ich es gemacht:
Zitat aus MySQL-Foren:
Nach dem Ausführen meiner Abfrage und dem Behandeln der Ergebnisse [C API:
mysql_store_result()
bearbeitet habe ], iteriere ich über alle weiteren potenziell ausstehenden Ergebnisse, die über die Ausführung mehrerer SQL-Anweisungen auftreten, z. B. zwei oder mehr select-Anweisungen (Rücken an Rücken, ohne die Ergebnisse zu behandeln).Tatsache ist, dass meine Prozeduren nicht mehrere Ergebnisse zurückgeben, aber die Datenbank weiß das erst, wenn ich Folgendes ausführe: [C API:
mysql_next_result()
]. Ich mache das in einer Schleife (für ein gutes Maß), bis es ungleich Null zurückgibt. In diesem Fall weiß der aktuelle Verbindungshandler, dass es in Ordnung ist, eine weitere Abfrage auszuführen (ich speichere meine Handler zwischen, um den Verbindungsaufwand zu minimieren).Dies ist die Schleife, die ich benutze:
Ich kenne PHP nicht, aber ich bin mir sicher, dass es etwas Ähnliches hat.
quelle
mysql
Erweiterung?Ich hatte heute das gleiche Problem, aber nur bei der Arbeit mit einer gespeicherten Prozedur. Dadurch verhält sich die Abfrage wie eine Mehrfachabfrage. Sie müssen also andere verfügbare Ergebnisse "verbrauchen", bevor Sie eine weitere Abfrage durchführen.
quelle
Ich rufe diese Funktion jedes Mal auf, bevor ich $ mysqli-> query verwende. Funktioniert auch mit gespeicherten Prozeduren.
quelle
Sobald Sie verwendet haben
Sie KÖNNEN es schließen eine weitere Abfrage zu verwenden.
Dieses Problem hat mich stundenlang gejagt. Hoffentlich wird es deine reparieren.
quelle
$stmt1->execute(); $stmt2=$conn->prepare(...)
würde diesen Fehler geben,$stmt1->execute(); $result1=$stmt1->get_result(); $stmt2=$conn->prepare(...)
würde aber gut funktionieren.Ich benutze CodeIgniter. Ein Server OK ... dieser wahrscheinlich älter ... Wie auch immer
Behoben.
quelle
Das Problem ist die MySQL-Client-C-Bibliothek, auf der die meisten MySQL-APIs basieren. Das Problem ist, dass die C-Bibliothek die gleichzeitige Ausführung von Abfragen nicht unterstützt, sodass alle darauf aufbauenden APIs dies auch nicht tun. Auch wenn Sie ungepufferte 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 tut gleichzeitige Abfragen unterstützen.
Ihre Lösung besteht darin, entweder den Algorithmus so zu ändern, dass nicht beide gleichzeitig ausgeführt werden müssen, oder sie so zu ändern, dass gepufferte Abfragen verwendet werden. Dies ist wahrscheinlich einer der ursprünglichen Gründe für ihre Existenz in der C-Bibliothek (der andere Grund ist dies) eine Art Cursor bereitstellen).
quelle
Um dieses Problem zu lösen, müssen Sie die Ergebnisdaten speichern, bevor Sie sie verwenden können
das ist alles
quelle
Eine andere Ursache: store_result () kann nicht zweimal aufgerufen werden.
Im folgenden Code wird beispielsweise Fehler 5 gedruckt.
(Dies ist möglicherweise nicht relevant für den ursprünglichen Beispielcode, kann jedoch für Personen relevant sein, die nach Antworten auf diesen Fehler suchen.)
quelle
Hier ist was mein Problem war !!!
Die Parameterbindung war "dynamisch", daher hatte ich eine Variable, die die Parameter der Daten festlegt , um bind_param zu verwenden . Diese Variable war also falsch, aber anstatt einen Fehler wie "falsche Parameterdaten" auszulösen, heißt es "nicht synchron bla bla bla", also war ich verwirrt ...
quelle
Ich denke, das Problem ist, dass Sie eine neue Verbindung in der Funktion herstellen und diese am Ende nicht schließen. Warum versuchen Sie nicht, die vorhandene Verbindung weiterzugeben und wiederzuverwenden?
Eine andere Möglichkeit besteht darin, dass Sie mitten in einer while-Schleife zurückkehren. Sie vervollständigen diesen äußeren Abruf nie.
quelle
Überprüfen Sie, ob Sie alle Parameter richtig eingeben. Es wird der gleiche Fehler ausgegeben, wenn die Anzahl der definierten und dann an die Funktion übergebenen Parameter unterschiedlich ist.
quelle
Dies hat nichts mit der ursprünglichen Frage zu tun, aber ich hatte die gleiche Fehlermeldung und dieser Thread ist der erste Treffer in Google. Ich habe eine Weile gebraucht, um herauszufinden, was das Problem war, sodass er für andere von Nutzen sein kann:
Ich verwende NICHT mysqli, sondern immer noch mysql_connect. Ich hatte einige einfache Abfragen, aber EINE Abfrage führte dazu, dass alle anderen Abfragen innerhalb derselben Verbindung fehlschlugen.
Ich benutze MySQL 5.7 und PHP 5.6 Ich hatte eine Tabelle mit dem Datentyp "JSON". offensichtlich hat meine PHP-Version den Rückgabewert von MySQL nicht erkannt (PHP wusste einfach nicht, was mit dem JSON-Format zu tun ist, weil das eingebaute MySQL-Modul zu alt war (zumindest denke ich))
Im Moment habe ich den JSON-Feldtyp in Text geändert (da ich momentan keine native MySQL-JSON-Funktionalität benötige) und alles funktioniert einwandfrei
quelle
Wenn Sie zum Abrufen von Daten entweder die gepufferte oder die ungepufferte Ergebnismenge verwenden, müssen Sie zuerst einfach die abgerufenen Daten aus dem Speicher löschen, nachdem Sie alle Daten abgerufen haben . Da Sie keine andere MYSQL-Prozedur auf derselben Verbindung ausführen können, bis Sie den abgerufenen Speicher gelöscht haben. Fügen Sie diese Funktion am rechten Ende Ihres Skripts hinzu, damit das Problem behoben wird
Referenz aus der PHP-Dokumentation
quelle
Ich bin mit Doctrine DBAL QueryBuilder auf diesen Fehler gestoßen.
Ich habe mit QueryBuilder eine Abfrage erstellt, die Spaltenunterauswahlen verwendet, die ebenfalls mit QueryBuilder erstellt wurden. Die Unterauswahlen wurden nur über erstellt
$queryBuilder->getSQL()
und nicht ausgeführt. Der Fehler trat beim Erstellen der zweiten Unterauswahl auf. Durch vorläufiges Ausführen jeder Unterauswahl mit$queryBuilder->execute()
vor der Verwendung$queryBuilder->getSQL()
funktionierte alles. Es ist, als ob die Verbindung$queryBuilder->connection
trotz der neuen QueryBuilder-Instanz in jeder Unterauswahl in einem ungültigen Zustand bleibt, um eine neue SQL zu erstellen, bevor die aktuell vorbereitete SQL ausgeführt wird.Meine Lösung bestand darin, die Unterauswahlen ohne QueryBuilder zu schreiben.
quelle
Ich verwende ODBC und dieses Update funktioniert für mich: ODBC -> Registerkarte System-DSN -> Doppelklick, um meine Datenquelle zu konfigurieren -> Details -> Registerkarte Cursor -> Deaktivieren [Ergebnisse von Cursoren nur für die Weiterleitung nicht zwischenspeichern] - > Klicken Sie auf OK
quelle
Ich habe diesen Fehler oft festgestellt und es ist immer dann, wenn ich eine gespeicherte Prozedur ausführe, die ich in phpmyadmin oder SQL Workbench debuggt habe (ich arbeite in PHP und verbinde mich mit mysqli).
Der Fehler resultiert aus der Tatsache, dass beim Debuggen an strategischen Punkten im Code SELECT-Anweisungen eingefügt werden, um den Status von Variablen usw. anzuzeigen. Das Ausführen einer gespeicherten Prozedur, die in diesen Clientumgebungen mehrere Ergebnismengen erzeugt, ist in Ordnung, führt jedoch zu " Befehle nicht synchron "Fehler beim Aufruf von PHP. Die Lösung besteht immer darin, die Debugging-Auswahl auskommentieren oder entfernen, damit die Prozedur nur eine Ergebnismenge hat.
quelle
Mein Problem war, dass ich zuerst die Prepare-Anweisung und dann die MySQL-Abfrage auf derselben Seite verwendete und den Fehler "Befehle nicht synchron; Sie können diesen Befehl jetzt nicht ausführen" erhielt. Der Fehler trat erst dann auf, als ich den Code mit der Prepare-Anweisung verwendete.
Ich habe die Frage geschlossen. und es hat funktioniert.
mysqli_stmt_close ($ stmt);
Mein Code
get_category.php (hier mit prepare-Anweisung)
admin_get_category_body.php (hier mysqli)
Etwas, das mir gerade in den Sinn gekommen ist, füge ich auch wieder eine Verbindungsvariable über eine globale $ -Verbindung hinzu. Ich denke also, dass nach dem Ende der prepare-Anweisung mit mysqli_stmt_close ($ stmt) im Grunde genommen ein ganz neuer Satz von Abfragesystemen gestartet wird. und auch ich füge diese Dateien und andere Sachen über include hinzu
quelle
Dies ist eine alte Frage, aber keine der geposteten Antworten funktionierte in meinem Fall. Ich stellte fest, dass in meinem Fall in einer gespeicherten Prozedur eine Tabelle ausgewählt und aktualisiert wurde. Dieselbe Tabelle hatte einen Aktualisierungsauslöser, der ausgelöst wurde und den auslöste Prozedur in eine Endlosschleife. Sobald der Fehler gefunden wurde, verschwand der Fehler.
quelle
Erstellen Sie zwei Verbindungen, verwenden Sie beide separat
quelle