【发布时间】:2017-11-24 09:23:51
【问题描述】:
我正在使用 drupal 7、PHP 7、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)
我该如何解决这个问题?
【问题讨论】:
-
听起来很奇怪。请详细说明环境 - 使用的软件、版本等。作为一种解决方法,您始终可以设置默认获取模式或使用 fetchObject 而不是 fetch()
-
此外,您不需要反射来找到方法,只需使用 get_class_methods()
-
啊,对,
get_class_methods产生相同的结果。然而,使用fetchObject不是一个有效的解决方法——请记住,我在这里使用drupal,我必须更改很多 代码。此外,生产仍然有效。