PDO dblib nextRowset funktioniert nicht

8

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:

%Vor%

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?

    
Jamesking56 24.06.2016, 11:56
quelle

2 Antworten

3

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.

    
Simone Pessotto 30.06.2016 10:31
quelle
0

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.

%Vor%

Es wird auch empfohlen, alle PDO-Operationen innerhalb des try-Blocks durchzuführen, andernfalls können Sie unbehandelte Ausnahmen erhalten.

    
Raihan Uddin Ahmed 29.06.2016 22:26
quelle

Tags und Links