2016-06-24 18 views
8

Ich bin dabei, eine PHP-Anwendung von der Ausführung in einer Windows-Umgebung in eine Linux-basierte Umgebung zu konvertieren.PDO dblib nextRowset funktioniert nicht

Es verwendet PDO, um gespeicherte Prozeduren gegen eine Microsoft SQL Server-Datenbank auszuführen.

Also, ich habe PHP 5.6.22, Apache, Freedds und PDO dblib installiert und konfiguriert, um die Anwendung zu erleichtern.

Die meisten Stored Procedure-Ausführungen funktionieren einwandfrei. Außer solchen, die mehrere Rowsets zurückgeben.

Als ich $pdo->nextRowset() nennen, ich diesen fatalen Fehler:

SQLSTATE[HY000]: General error: PDO_DBLIB: dbresults() returned FAIL 

Der einzige Hinweis, den ich dazu finden war eine in PHP 5.6.9 gemeldet Fehler, der behoben.

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?

+0

Können Sie einen detaillierteren Fehler als den Fehler zurückgeben, indem Sie die Einstellungen in 'php.ini' für die Fehlerausprägung optimieren (sorry, ich habe PHP seit Jahren nicht mehr berührt oder genauer gesagt). Wenn wir den tatsächlichen FreeTDS-Fehler auf die Oberfläche bringen können, wäre das viel einfacher zu diagnostizieren, da Sie wahrscheinlich den SQL Server-Treiber unter Windows für FreeTDS unter Linux austauschen. – FlipperPA

+0

PHP ist am höchsten Ausführlichkeit und zeigt nur die Fehlermeldung in meiner Frage. – Jamesking56

+0

Überprüfen Sie einfach, haben Sie die Prozedur durch einen Aufruf ausgeführt? – Ctc

Antwort

0

Ich hatte das gleiche Problem mit PDO::nextRowset(), da es True zurückgibt auch dort keine Rowsets mehr verfügbar ist, daher beim Aufruf fetchAll(), löst Ausnahme HY000 aus.

Sie können einem einfachen Trick folgen, indem Sie die Anzahl der Spalten mit Methode PDO::columnCount() vor dem Abrufen von Rowset überprüfen. Wenn es nicht Null ist, haben Sie ein gültiges Rowset, und Sie könnten PDO::fetchAll() aufrufen.

Auch wenn PDO::nextRowset() Berichte wahr sind, meldet columnCount() die Anzahl der Spalten, bevor zum nächsten Rowset gewechselt wird.

while ($pdo->columnCount()) { 
    $data[] = $pdo->fetchAll(PDO::FETCH_ASSOC); //or, $pdo->fetchAll() 
    $pdo->nextRowset(); 
} 

Auch wird empfohlen, alle PDO Operationen innerhalb des try-Block zu machen, sonst können Sie nicht behandelte Ausnahmen erhalten.

3

Sie rufen Daten mit PDO::fetch oder PDO::fetchAll ab? 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, für mich zu Kraft arbeitet alle Zeilenbis PDO::fetch false zurück, scannen dann PDO::nextRowset() normalerweise ausgeführt wird.

Wenn Sie nur eine Zeile in einem Rowset haben, müssen Sie mindestens zwei Mal (1 für Daten abrufen und 1 für Falsch ausgeben) PDO::fetch aufrufen und dann zum nächsten Rowset wechseln.

+0

Es wäre nett, wenn dieses Müll Verhalten irgendwo dokumentiert wäre, wie auf der Handbuchseite für PDO :: nextRowset(). –

+0

Ja, es wäre wirklich nett ... Ich habe Stunden mit diesem Verhalten verbracht, bis ich dieses "Problem" (oder Feature ...) gefunden habe. –