Ich bin dabei, eine PHP-Anwendung von einer Windows-Umgebung in eine Linux-basierte Umgebung zu konvertieren.
Es verwendet PDO, um gespeicherte Prozeduren gegen eine Microsoft SQL Server-Datenbank auszuführen.
Also, ich habe PHP 5.6.22, Apache, freetds und PDO dblib installiert und konfiguriert, um die Anwendung zu erleichtern.
Die meisten Stored Procedure-Ausführungen funktionieren einwandfrei. Außer denen, die mehrere Rowsets zurückgeben.
Wenn ich $pdo->nextRowset()
aufruft, bekomme ich diesen fatalen Fehler:
Die einzige Referenz, die ich finden konnte, war ein Fehler in PHP 5.6.9, der behoben wurde.
Allerdings bekomme ich das gleiche Problem in PHP 5.6.22.
Hat jemand irgendwelche Ideen, warum das passiert und wie ich es lösen kann?
Holen Sie Daten mit PDO::fetch
oder PDO::fetchAll
? Denn wenn Sie die "fetch" -Methode verwenden und nicht das Ende der Zeilen erreichen, wird PDO::nextRowset()
fehlschlagen (ich weiß nicht warum, es ist mir einfach passiert).
Also funktioniert es für force, alle Zeilen zu scannen , bis PDO::fetch
false zurückgibt , dann wird PDO::nextRowset()
normal ausgeführt.
Wenn Sie nur eine Zeile in einem Rowset haben, müssen Sie PDO::fetch
mindestens zweimal aufrufen (1 für Daten abrufen und 1 für false zurückgeben) und dann zum nächsten Rowset wechseln.
Ich hatte das gleiche Problem mit PDO::nextRowset()
, da es true zurückgibt, obwohl keine Rowsets mehr verfügbar sind. Daher ruft es beim Aufruf von fetchAll()
die Ausnahme HY000
auf.
Sie können einem einfachen Trick folgen, indem Sie die Anzahl der Spalten mit der Methode überprüfen
PDO::columnCount()
vor dem Abrufen des Rowsets. Wenn es nicht Null ist, haben Sie ein gültiges Rowset und können daher PDO::fetchAll()
aufrufen.
Auch wenn PDO::nextRowset()
true meldet, meldet columnCount()
die Anzahl der Spalten, bevor es zum nächsten Rowset wechselt.
Es wird auch empfohlen, alle PDO-Operationen innerhalb des try-Blocks durchzuführen, andernfalls können Sie unbehandelte Ausnahmen erhalten.
Tags und Links sql-server php centos pdo freetds