【问题标题】:Call to undefined method PDOStatement::setFetchMode()调用未定义的方法 PDOStatement::setFetchMode()
【发布时间】: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,我必须更改很多 代码。此外,生产仍然有效。

标签: php pdo drupal xampp


【解决方案1】:

解决方案是:尝试将其关闭再打开 - 在本例中为 Apache 服务器。显然内存中的某些内容已损坏,并且重新启动服务器修复了它。

我认为这已经通过我昨天在问题出现后关闭计算机并在今天早上再次启动它来完成。现在我知道了:Windows 8 及更高版本使用混合关机/休眠而不是真正的关机,因此如果您认为您重新启动了 PC,您的 apache 服务并不会真正重新启动。

不知怎的,这让我觉得自己很愚蠢......

【讨论】:

  • 你有激活 opcache 吗?
  • 我想是的,在我的phpinfo() 输出中有一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2014-11-22
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2019-10-25
相关资源
最近更新 更多