2017-11-24 157 views
6

pracuję z Drupal 7, na PHP 7, na xampp na Windows i nagle zaczynam otrzymuję następujący błąd:Call to metoda niezdefiniowany PDOStatement :: setFetchMode()

Call to undefined method DatabaseStatementBase::setFetchMode() 

Gdzie DatabaseStatementBase rozciąga PDOStatement bezpośrednio. Podczas zmniejszania kodu do następującego minimum:

<?php 
$dbh = new PDO('mysql:host=localhost;dbname=test', 'test', 'test'); 
$pdostatement = $dbh->prepare('SELECT * FROM items WHERE id=?'); 
$pdostatement->setFetchMode(PDO::FETCH_CLASS); 
$success = $pdostatement->execute([1]); 
// do stuff... 

Nadal powoduje błąd na linii dotyczącej trybu setFetchMode. Kiedy skomentuję ten wiersz, nie zostanie zgłoszony błąd, ale otrzymam tablicę asocjacyjną zamiast obiektu - nie tego, czego oczekuje drupal. Zwłaszcza, że ​​setFetchMode powinna istnieć (patrz http://php.net/manual/en/pdostatement.setfetchmode.php)

Wreszcie, kiedy następnie starają się znaleźć sposoby na $pdostatement przy użyciu refleksji, mam śmieci na niektóre z nazw - lub, bardziej precyzyjnie, nazwa wydaje około 1.5MB długo i zawiera wiele nieczytelnych znaków i niektóre nazwy metod, tak jakby była tam załadowana cała biblioteka DLL. Oto przykład tego, co var_dump (php7 & XDebug) czynią z niego:

object(ReflectionMethod)[17] 
    public 'name' => string '����&������p�aZ������������ ���bindParam�������{�nZ���������������setAttribute����f�kZ����������j����FETCH_ORI_FIRST�a�pZ���������q�� 
    ���CURSOR_SCROLL���l�}Z���������������fetchColumn������zZ��������������wph�����&��������Z���������������debugDumpParams���Z��������.�����children����������Z������������wphX����&��������Z��������(�� 
    ���nextrowset��������Z������������ 
    ���__toString������ ��Z������������wph(����&������4��Z��������'... (length=1752201104) 
    public 'class' => string 'PDOStatement' (length=12) 

Jak mogę rozwiązać ten problem?

+0

Brzmi dziwnie. Proszę opracować środowisko - używane oprogramowanie, wersje itp. Jako obejście można zawsze ustawić domyślny tryb pobierania lub użyć [fetchObject] (https://phpdelusions.net/pdo/objects#fetch) zamiast funkcji pobierania() –

+0

poza tym, nie potrzebujesz refleksji, aby znaleźć metody, wystarczy użyć get_class_methods() –

+0

Ah, prawda, 'get_class_methods' yiels ten sam wynik. Jednak użycie 'fetchObject' nie jest poprawnym obejściem - pamiętaj, że pracuję tutaj z Drupalem, musiałbym zmienić _lot_ kodu. Poza tym produkcja nadal działa. –

Odpowiedz

1

Rozwiązaniem było: spróbuj go wyłączyć i włączyć ponownie - w tym przypadku serwer Apache. Najwyraźniej coś zostało uszkodzone w pamięci, a restart serwera naprawił to.

Założę, że to już zrobiłem, zamykając komputer wczoraj, po pojawieniu się problemu i uruchamiając go ponownie dziś rano. Teraz już wiem: Windows 8 i nowsze używają hybrydowego zamykania/hibernacji zamiast prawdziwego wyłączania, więc twoja usługa Apache nie zostanie ponownie uruchomiona, jeśli myślisz, że zrestartowałeś swój komputer.

Jakoś to sprawia, że ​​czuję się tak głupi ...

+1

czy masz aktywny opcache? – Wes

+0

Wydaje mi się, że w moim wyjściu "phpinfo()" jest jedna linia. –