我正在使用drupal 7、php7和windows上的xampp,突然我发现以下错误:

Call to undefined method DatabaseStatementBase::setFetchMode()

其中databasestatementbase直接扩展pdostatement。将代码减少到以下最小值时:
<?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...

它仍然在关于setfetchmode的行上抛出一个错误。当我注释那一行时,不会抛出错误,但是我得到的是一个关联数组而不是一个对象——这不是Drupal所期望的。尤其是因为setfetchmode应该存在(请参见http://php.net/manual/en/pdostatement.setfetchmode.php
最后,当我试图使用反射查找$pdostatement的方法时,我会得到一些名称的垃圾,或者更准确地说,这个名称看起来大约有1.5MB长,并且包含许多不可读的字符和一些方法名,好像在其中加载了整个dll之类的东西。下面是var_dump(php7&xdebug)的构成示例:
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)

我该怎么解决?

最佳答案

解决方案是:尝试关闭并再次打开它-在本例中是apache服务器。显然内存中有损坏,重新启动服务器修复了它。
我想这已经是我昨天在问题出现后关闭了我的电脑,今天早上又重新启动了。现在我知道了:windows 8和更高版本使用混合关机/休眠而不是真正的关机,所以如果你认为你重新启动了你的pc,那么你的apache服务就不会真正重新启动。
不知怎的,这让我觉得很傻…

07-26 06:44