2016-06-24 51 views
8

Jestem w trakcie przekształcania aplikacji PHP z działania w środowisku Windows na środowisko oparte na systemie Linux.PDO dblib nextRowset nie działa

Wykorzystuje on PDO do uruchamiania procedur przechowywanych w bazie danych Microsoft SQL Server.

Zainstalowałem i skonfigurowałem PHP 5.6.22, Apache, freetds i pdo dblib, aby ułatwić aplikację.

Większość procedur wykonywanych w ramach procedury składowanej działa doskonale. Z wyjątkiem tych, które zwracają wiele zestawów wierszy.

Kiedy zadzwonić $pdo->nextRowset(), otrzymuję ten błąd krytyczny:

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

Jedyne odniesienie znajdę to był błąd, podano w PHP 5.6.9, która została ustalona.

Jednak otrzymuję ten sam problem w PHP 5.6.22.

Czy ktoś ma jakieś pomysły, dlaczego tak się dzieje i jak mogę to rozwiązać?

+0

Czy możesz zwrócić bardziej szczegółowy błąd niż niepowodzenie, modyfikując to ustawienie w 'php.ini', aby uzyskać szczegółową informację o błędach (przepraszam, nie dotykałem PHP od lat lub chciałbym być bardziej szczegółowy). Jeśli uda nam się uzyskać rzeczywisty błąd FreeTDS w celu wypuszczenia baniek na powierzchnię, będzie to znacznie łatwiejsze do zdiagnozowania, ponieważ prawdopodobnie zamienisz sterownik SQL Server w systemie Windows na FreeTDS w systemie Linux. – FlipperPA

+0

PHP jest na najwyższym poziomie gadatliwości i wyświetla tylko komunikat o błędzie z mojego pytania. – Jamesking56

+0

Po prostu sprawdzenie, czy uruchomiłeś procedurę przez pobranie? – Ctc

Odpowiedz

0

Miałem ten sam problem z PDO::nextRowset(), ponieważ zwraca true, nawet jeśli nie ma już dostępnych zestawów wierszy, dlatego wywołanie fetchAll() powoduje zgłoszenie wyjątku HY000.

Możesz wykonać prostą sztuczkę, sprawdzając liczbę kolumn metodą PDO::columnCount() przed pobraniem zestawu zestawów. Jeśli jest niezerowa, masz poprawny zestaw wierszy, a zatem możesz zadzwonić pod numer PDO::fetchAll().

Nawet jeśli PDO::nextRowset() zgłasza prawdziwe, columnCount() zgłosi liczbę kolumn przed przejściem do następnego zestawu zestawów wierszy.

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

Ponadto, zaleca się, aby wszystkie operacje PDO wewnątrz bloku try, w przeciwnym razie można dostać nieobsługiwany wyjątki.

3

Czy pobierasz dane za pomocą PDO::fetch lub PDO::fetchAll? Ponieważ jeśli użyjesz metody "pobierania" i nie dojdziesz do końca wierszy PDO::nextRowset() zawiedzie (nie wiem dlaczego, po prostu mi się to przydarzyło).

Tak, dla mnie działa życie skanować wszystkie wierszePDO::fetch wraca fałszywe, następnie PDO::nextRowset() wykona normalnie.

Oznacza to, że jeśli w zestawie wierszy znajduje się tylko jeden wiersz, należy wywołać co najmniej dwa razy numer PDO::fetch (1 dla danych do pobrania i 1, aby zwrócić fałsz), a następnie przejść do następnego zestawu wierszy.

+0

Byłoby miło, gdyby to zachowanie śmieci zostało udokumentowane gdzieś, jak na stronie podręcznika dla PDO :: nextRowset(). –

+0

Tak, byłoby naprawdę miło ... spędziłem wiele godzin na tym zachowaniu, dopóki nie znalazłem tego "problemu" (lub funkcji ..) –