Zend framework2 对数据库pdo结果集进行两次迭代,在zend framework 2中引发异常

Zend framework2 对数据库pdo结果集进行两次迭代,在zend framework 2中引发异常,zend-framework2,Zend Framework2,正在文件上获取Zend\Db\Adapter\Exception\RuntimeException \library\Zend\Db\Adapter\Driver\Pdo\Result.php:159 我的数据库设置代码是 array( 'db' => array( 'driver' => 'Pdo', 'pdodriver' => 'mysql', 'driver_opti

正在文件上获取
Zend\Db\Adapter\Exception\RuntimeException

\library\Zend\Db\Adapter\Driver\Pdo\Result.php:159
我的数据库设置代码是

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',
  ),
)
$statement  = $this->sql->prepareStatementForSqlObject($select);
$results    = $statement->execute();
结果获取代码为

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',
  ),
)
$statement  = $this->sql->prepareStatementForSqlObject($select);
$results    = $statement->execute();
我尝试了
$results->buffer()&&
$results->rewind()

我的迭代代码如下

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

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

这是因为PDO结果集是只向前的(所以你不能倒带它)

您可以尝试使用结果集对其进行包装:

$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();

这是因为PDO结果集是只向前的(所以你不能倒带它)

您可以尝试使用结果集对其进行包装:

$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();

您看到的例外情况是:

此结果是一个仅向前的结果集,在 不支持向前推进

因此,简单的解决方案是将结果存储在一个数组中,然后可以在该数组上迭代多次

$records = array();

foreach ($results as $result)
{
    $records[] = $result;
}

您看到的例外情况是:

此结果是一个仅向前的结果集,在 不支持向前推进

因此,简单的解决方案是将结果存储在一个数组中,然后可以在该数组上迭代多次

$records = array();

foreach ($results as $result)
{
    $records[] = $result;
}

对我来说,这个解决方案似乎更好,因为您一直将结果集包装在ZF2对象中以进行操作@如果这是ZF2团队的意图,则应在toArray()方法中考虑drbeza方法。我认为该解决方案更好,因为您一直将结果集包装在ZF2对象中以进行操作@drbeza方法应该在toArray()方法中考虑,如果这是ZF2团队的意图在遇到同样的问题并使用与本答案中提到的相同的解决方案后,我发现php函数可以获得相同的结果。绝对比每次需要这种结果集时写5行样板文件要好。在遇到同样的问题并使用了与此答案中提到的相同的解决方案后,我发现php函数可以获得相同的结果。绝对比每次需要这种结果集时写5行样板文件要好。