Pakete außerhalb der Reihenfolge Fehler beim Aufruf von MySQL stored proc
Bin ich versucht, rufen Sie eine gespeicherte Prozedur mit PDO, aber erhalte die folgende Fehlermeldung, wenn Sie versuchen zu tun, ein fetch auf die Ergebnisse.
Warnung: Pakete außerhalb der Reihenfolge. Voraussichtlich zum 1 erhielt 16. Paket size=163
Meine gespeicherte Prozedur verwendet zwei Cursor, die ich in der Nähe, vor der Auswahl aus der temporären Tabelle. Ich bin zu Ahnen, das könnte das problem sein, da kann ich rufen Sie meine SP direkt in MySQL und kann die Ergebnisse sehen. Auch ich hatte nie ein problem mit dieser SP bei der Verwendung der php_mysql Erweiterung vor der Migration zu php_pdo_mysql.dll.
Ich bin auch in der Lage, meinen andere, einfachere gespeicherte Prozeduren mit INPUT-Parameter in PHP mit PDO und können die Ergebnisse abrufen, ohne irgendwelche Fehler.
Hier ist der code, der den Fehler zurück:
$db = new PDO('mysql:host='.__DB_HOST__.';dbname='.__DB_NAME__.';charset=utf8', __DB_USER__, __DB_PASS__);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
/* DOES NOT WORK */
$queryResult = $db->prepare("CALL GetResults(:siteId,null)");
$siteId = 19;
$queryResult->bindValue(':siteId', $siteId, PDO::PARAM_INT);
$queryResult->execute();
$result = $queryResult->fetchAll(PDO::FETCH_ASSOC); //returns packets out of order warning
print_r($result);
Habe ich diesen code in einen Try/Catch-block und wird keine exception geworfen. In der Tat, PHP zeigt dies als eine Warnung im browser.
Meine Gespeicherten Prozedur-Signatur sieht wie folgt aus:
CREATE DEFINER=`root`@`localhost`
PROCEDURE `GetResults`(IN siteIdParam INT(11), IN siteSearchText VARCHAR(45))
Ich bin mir auch nicht sicher, ob das problem mit der Weitergabe null als einer der params. Manchmal ist der erste parameter übergibt null, manchmal ist es das 2te. Aber egal es funktioniert immer direkt auf den MySQL-server.
Versuchte ich bindParam und bindValue, die gleiche Ergebnisse. Ich kann auch per post mein SP aber es wäre des guten zuviel.
Gibt es eine Möglichkeit, schalten Sie zusätzliche Protokollierung von der PDO-Erweiterung?
Irgendwelche Ideen oder Vorschläge? Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen.
HINWEIS: ich bin mit PHP v5.5.4 und MySQL v5.6.14.
Ich hatte das gesehen, und habe versucht, verschiedene Kombinationen, aber ich bin mir nicht sicher, wie konvertiert man die mysqli-gepostet Lösung PDO...
InformationsquelleAutor http203 | 2013-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem er viele Stunden mit dem Versuch zu isolieren Teile von meinem code, um dieses problem zu lösen, bemerkte ich, dass der Fehler ging Weg nach Einstellung der ATTR_EMULATE_PREPARES-flag auf true.
Dieser erzählt PDO zu emulieren, die prepared statements statt nativ von MySQL. Von dem, was ich gelesen habe, es wird generell empfohlen, schalten Sie dieses flag deaktivieren (ist es standardmäßig true), wenn Sie die meisten up-to-date-version von MySQL und PHP. Weitere Informationen finden Sie auf, dass Sie in diesem SO Artikel.
Ich glaube, dass dies ein bug mit MySQL (ich hatte das problem bis version 5.6.17). Gibt es nicht viel Diskussion über diese problem ich hoffe das spart jemand Stunden mit der Fehlersuche. Das problem wird auch diskutiert, auf diese MySQL-Fehler-Seite, aber die gepostete Lösung hat mir nicht helfen in meiner situation.
Rufen Sie die Funktion setAttribute auf Ihre PDO-Objekt. Für ex: $db = new PDO(...); $db- > setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
InformationsquelleAutor http203
Ich lief in das gleiche problem, sobald ich versucht, die änderung der PDO::ATTR_EMULATE_PREPARES Attribut.
Kann ich zuverlässig reproduzieren, was Sie beschrieben haben, wenn ich versuche zu rufen, eine zweiten vorbereitete Anweisung auf der gleichen PDO-Verbindung. So etwas wie dieses:
Ich weiß, dass dein Beispiel zeigt nur einen Anruf, sondern um diesen Fehler auslösen, die gespeicherte Prozedur aufruft, nicht in der gleichen Datei, nur teilen die gleiche PDO-Verbindung. Ich hoffe, dass meine folgenden Ratschläge hilft immer noch.
Wenn Sie eine gespeicherte Prozedur ausführen, wird die MySQL-Treiber gibt zwei rowsets. Die native-Treiber erfordert, dass Sie verarbeitet, bevor Sie verwenden Sie Ihre Verbindung. Sie müssen Voraus, um die zweite rowset, auch wenn Sie nicht kümmern, was in ihm ist und auch schließen Sie den cursor vor der Vorbereitung und beim Aufruf der zweiten. Wie diese:
Sieht es aus wie PDO ' s emuliert bereitet sind nachsichtiger, wenn Sie vergessen, machen diese zwei zusätzlichen Aufrufe.
InformationsquelleAutor Matt
@http203 ich lief in das gleiche Problem mit WAMP-server mit mysql 5.6.17 mit dieser
behebt das Problem, aber ich empfehle auch erhöht das Abfrage-limit in der mysql.ini
zu
zu verhindern, dass künftige Probleme, für jedermann mit einem relativen problem Lesen Sie dieses Referenz-Artikel Warnung: Pakete außerhalb der Reihenfolge, MySQL server has gone away
InformationsquelleAutor revobtz
Für mich, Einstellung
PDO::ATTR_PERSISTENT
zufalse
wurde das Problem behoben.Problem erstmals Auftritt, nachdem
mysql_upgrade
-ing MariaDB. Nicht sicher, was das eigentliche problem ist. :-/InformationsquelleAutor DanMan
Habe ich den cursor in meinem gespeicherten Prozedur. Ich löste durch das Holen von alle Datensätze auf einmal und dann Durchlaufen. Ich habe nicht das 'notice' nicht mehr
InformationsquelleAutor Karthik N G