Home  >  Q&A  >  body text

Required to be compatible with PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args)

Our client has a drupal website, but the host forces all clients to go from PHP 7.4 to PHP version 8, causing a PDO fatal error that prevents the website from loading.

Error received:

Fatal error: Statement DrupalCoreDatabaseStatement::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) /usr/www/users/kdpsipxqzt/core/lib/Drupal/Core/Database/Statement.php At line 168

The function causing the problem:

ERROR (L 168) -> 
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);
    }
  }

Does anyone have any ideas to solve this problem?

I've tried multiple ways to troubleshoot and adjust the function to better match PHP's PDOStatement parent function, but with no success!

Comparison with PHP's PDOStatement:

public function fetchAll($how = null, $className = null, $ctorArgs = null)

Did I miss something?

P粉308089080P粉308089080337 days ago443

reply all(1)I'll reply

  • P粉265724930

    P粉2657249302023-12-11 11:18:48

    The return type must be set to array:

    public function fetchAll($mode = null, $column_index = null, $constructor_arguments = null) : array { ... }

    If you are using PHP8.1, you can bypass this error by adding the comment #[\ReturnTypeWillChange]

    reply
    0
  • Cancelreply