You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7.4升级至PHP8导致Drupal网站PDO兼容错误求助

解决Drupal在PHP8下的PDO fetchAll致命错误

客户的Drupal网站在主机强制将PHP从7.4升级到8后,出现PDO致命错误导致网站无法加载,错误信息如下:

Fatal error: Declaration of
Drupal\Core\Database\Statement::fetchAll(int $mode =
PDO::FETCH_DEFAULT, $column_index = null, $constructor_arguments =
null) must be compatible with PDOStatement::fetchAll(int $mode =
PDO::FETCH_DEFAULT, mixed ...$args) in
/usr/www/users/kdpsipxqzt/core/lib/Drupal/Core/Database/Statement.php
on line 168

问题出在Statement.php第168行的fetchAll方法,原代码为:

public function fetchAll($mode = null, $column_index = NULL, $constructor_arguments = NULL) {
    // Call \PDOStatement::fetchAll to fetch all rows.
    // \PDOStatement is picky about the number of arguments in some cases so we
    // need to be pass the exact number of arguments we where given.

    switch (func_num_args()) {
      case 0:
        return parent::fetchAll();
      case 1:
        return parent::fetchAll($mode);
      case 2:
        return parent::fetchAll($mode, $column_index);
      case 3:
      default:
        return parent::fetchAll($mode, $column_index, $constructor_arguments);
    }
  }

核心原因

PHP 8.0对PDOStatement::fetchAll的方法签名做了关键修改:

  • PHP 7.x签名:public function fetchAll($how = null, $className = null, $ctorArgs = null)
  • PHP 8.x签名:public function fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args)

旧版Drupal的方法声明与新签名完全不兼容,这是触发致命错误的直接原因。

解决方法

方法1:升级Drupal到兼容PHP8的版本(推荐)

这是最稳妥的长期解决方案:Drupal 9.3及以上版本、Drupal 10全版本都原生支持PHP8.x,官方已修复该兼容性问题。升级后不仅解决当前错误,还能同步获得安全更新和功能迭代支持。

方法2:临时修改核心文件(应急用,不推荐长期使用)

如果暂时无法升级,可手动修改core/lib/Drupal/Core/Database/Statement.php中的fetchAll方法,让签名完全匹配PHP8的要求:

替换原方法为:

public function fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args) {
    // Call \PDOStatement::fetchAll to fetch all rows.
    switch (count($args)) {
        case 0:
            return parent::fetchAll($mode);
        case 1:
            return parent::fetchAll($mode, $args[0]);
        case 2:
            return parent::fetchAll($mode, $args[0], $args[1]);
        default:
            return parent::fetchAll($mode, ...$args);
    }
}

关键注意点:

  • 必须保证方法签名完全一致:包括参数类型声明(int $mode)、默认值(PDO::FETCH_DEFAULT)、可变参数语法(mixed ...$args),这是之前修改无效的核心原因——仅调整参数名称或顺序无法解决兼容性问题。
  • 修改核心文件会导致后续Drupal升级时被覆盖,需在升级前备份或重新修改。

内容的提问来源于stack exchange,提问作者Christopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:25:51