2017-11-24 20 views
6

Tôi đang làm việc với drupal 7, trên PHP 7, trên XAMPP trên Windows, và đột nhiên tôi bắt đầu nhận được các lỗi sau:Gọi phương pháp xác định PDOStatement :: setFetchMode()

Call to undefined method DatabaseStatementBase::setFetchMode() 

đâu DatabaseStatementBase kéo dài PDOStatement trực tiếp. Khi giảm mã xuống mức tối thiểu sau:

<?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... 

Nó vẫn phát sinh lỗi trên dòng liên quan đến setFetchMode. Khi tôi nhận xét rằng dòng ra, không có lỗi được ném, nhưng tôi nhận được một mảng kết hợp thay vì một đối tượng - không phải những gì drupal mong đợi. Đặc biệt vì setFetchMode nên tồn tại (xem http://php.net/manual/en/pdostatement.setfetchmode.php)

Cuối cùng, khi tôi cố gắng tìm các phương pháp phản chiếu sử dụng $pdostatement, tôi lấy rác cho một số tên - hoặc chính xác hơn, tên có vẻ dài khoảng 1,5MB và chứa rất nhiều ký tự không đọc được và một số tên phương thức, như thể toàn bộ DLL được tải trong đó hoặc một cái gì đó. Dưới đây là một ví dụ về những gì var_dump (php7 & Xdebug) làm cho nó:

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) 

Làm thế nào tôi có thể sửa lỗi này?

+0

Âm thanh lạ. Vui lòng giải thích về môi trường - phần mềm được sử dụng, phiên bản, v.v. Như một giải pháp bạn luôn có thể đặt chế độ tìm nạp mặc định hoặc sử dụng [fetchObject] (https://phpdelusions.net/pdo/objects#fetch) thay vì tìm nạp() –

+0

bên cạnh đó, bạn không cần sự phản chiếu để tìm ra các phương thức, chỉ cần sử dụng get_class_methods() –

+0

Ah, right, 'get_class_methods' yiels cùng một kết quả. Tuy nhiên, bằng cách sử dụng 'fetchObject' không phải là một giải pháp hợp lệ - hãy nhớ, tôi đang làm việc với drupal ở đây, tôi phải thay đổi một _lot_ của mã. Bên cạnh đó, sản xuất vẫn hoạt động. –

Trả lời

1

Giải pháp là: thử tắt và bật lại - trong trường hợp này là máy chủ Apache. Rõ ràng một cái gì đó đã bị hỏng trong bộ nhớ, và khởi động lại máy chủ cố định nó.

Tôi cho rằng điều này đã được thực hiện bởi tôi tắt máy tính của mình hôm qua, sau khi sự cố đã xuất hiện và khởi động lại vào sáng nay. Bây giờ tôi biết: windows 8 và up sử dụng một tắt máy lai/ngủ đông thay vì tắt máy thực sự, do đó, dịch vụ apache của bạn không thực sự được khởi động lại nếu bạn nghĩ rằng bạn khởi động lại máy tính của bạn.

Bằng cách nào đó điều này khiến tôi cảm thấy quá câm ...

+1

bạn có hoạt động opcache không? – Wes

+0

Tôi nghĩ vậy, có một dòng cho nó trong đầu ra 'phpinfo()' của tôi. –

Các vấn đề liên quan