对数据库pdo结果集进行两次迭代,在zend框架2中抛出异常

rab*_*rab 1 zend-framework2

上传Zend\Db\Adapter\Exception\RuntimeException文件

\library\Zend\Db\Adapter\Driver\Pdo\Result.php:159
Run Code Online (Sandbox Code Playgroud)

我的数据库设置代码是

array(
  'db' => array(
        'driver'         => 'Pdo',
        'pdodriver'      => 'mysql',            
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
            'buffer_results' => true
        ),
        'username'       => 'root',
        'password'       => '',
        'host'           => 'localhost',
        'dbname'         => 'db_name',
  ),
)
Run Code Online (Sandbox Code Playgroud)

结果提取代码是

$statement  = $this->sql->prepareStatementForSqlObject($select);
$results    = $statement->execute();
Run Code Online (Sandbox Code Playgroud)

我试过$results->buffer();&& $results->rewind()

我的迭代代码就像

foreach ( $results as $result ){    
       // code goes here ..
}
....

foreach ( $results as $result ){    
       // code goes here ..
}
Run Code Online (Sandbox Code Playgroud)

And*_*rew 9

这是因为PDO结果集是Forward Only(因此您无法回放它).

您可以尝试使用ResultSet包装它:

$results    = $statement->execute(); // generate your results

$resultSet = new ResultSet; // Zend\Db\ResultSet
$resultSet->initialize($results);

// You should now be able to iterate over this multiple times..
foreach($resultSet as $row) {
    // .. 
}

// You can now buffer if you need..
$resultSet->buffer();
// Or get an array of all items
$arrayOfResults = $resultSet->toArray();
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案对我来说似乎更好,因为你继续将ResultSet包装在ZF2对象中进行操作.如果那是ZF2团队的意图,应该在toArray()方法中考虑@drbeza方法 (2认同)