Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 此结果是仅向前的结果集,不支持在向前移动后调用rewind()_Php_Mysql_Zend Framework_Zend Framework2 - Fatal编程技术网

Php 此结果是仅向前的结果集,不支持在向前移动后调用rewind()

Php 此结果是仅向前的结果集,不支持在向前移动后调用rewind(),php,mysql,zend-framework,zend-framework2,Php,Mysql,Zend Framework,Zend Framework2,在Zend app中,我使用Zend\Db\TableGateway和Zend\Db\Sql从MySQL数据库中检索数据,如下所示 模型- public function getCandidateEduQualifications($id) { $id = (int) $id; $rowset = $this->tableGateway->select(function (Sql\Select $select) use ($id) { $s

在Zend app中,我使用
Zend\Db\TableGateway
Zend\Db\Sql
从MySQL数据库中检索数据,如下所示

模型-

public function getCandidateEduQualifications($id)
{
    $id  = (int) $id;

    $rowset = $this->tableGateway->select(function (Sql\Select $select) use ($id)
    {
        $select->where
            ->AND->NEST->equalTo('candidate_id', $id)
            ->AND->equalTo('qualification_category', 'Educational');
    });

    return $rowset;
}
看法-

我只是在视图中迭代$rowset和echo。但当尝试回显两次或多次时,会出现错误。单次迭代有效

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

我可以通过将它加载到视图中的另一个数组来解决它。但这是最好的方式吗?还有别的办法吗

$records = array();
foreach ($edu_qualifications as $result) {
    $records[] = $result;
}
编辑-


$resultSet->buffer()解决了问题。

您收到此
异常,因为这是预期的行为。Zend用于获取它的
Zend\Db\ResultSet\ResultSet
,它由
Zend\Db\TableGateway\TableGateway
返回。PDO结果集在默认情况下使用仅向前的游标,这意味着您只能在集合中循环一次

有关游标的更多信息,请参阅和文章


由于
Zend\Db\ResultSet\ResultSet
实现了PHP,您可以使用
Zend\Db\ResultSet\ResultSet:toArray()
方法或使用
迭代器\u to \u array()
函数提取集合的数组。但在潜在的大型数据集上使用此函数时一定要小心!游标最好的一点就是,它们避免了一次就把所有数据都带进来,以防数据集太大,所以有时您不想一次把所有数据都放到一个数组中

当然,当我们使用Mysql并想要迭代$resultSet时,这个错误会发生,b/c Mysqli只会发生 向前移动的结果集(请参阅此帖子:)

我也遇到了这个问题。但当添加以下行时,它解决了:

$resultSet->buffer();
但在这篇提到的文章中,它建议使用以下行。我只是想知道为什么,它们的区别是什么:

$resultSet->getDataSource()->buffer(); 
这对我有用

public function fetchAll()
    {

        $select = $this->tableGateway->getSql()->select(); 
        $resultSet = $this->tableGateway->selectWith($select);
        $resultSet->buffer();
        $resultSet->next();

        return $resultSet;
    }

关于buffer()?使用
Zend\Db\ResultSet\ResultSet::buffer()
每次调用
Zend\Db\ResultSet\ResultSet::current()
时,当前行将保留在
Zend\Db\ResultSet\ResultSet::$buffer
。此循环可以是
foreach()
。因此,基本上,在第一个
foreach()
循环中,数据将来自数据库,在第二个循环中,数据将来自
Zend\Db\ResultSet\ResultSet::$buffer
。如果要使用
Zend\Db\ResultSet\ResultSet::buffer()
,则必须在循环遍历集合之前调用它,因为集合必须知道它需要缓冲。可以循环两次相同的结果,但必须显式地告诉
Zend\Db\ResultSet\ResultSet
以缓冲数据。我的猜测是,默认情况下它不会启用,因为对于大数据,您将消耗大量内存。虽然关于可接受解决方案的技术说明很重要,但这应该是可接受的解决方案,因为它是解决初始问题的更简单方法。
$sql = new Zend\Db\Sql($your_adapter);

$select = $sql->select('your_table_name'); 

$statement = $sql->prepareStatementForSqlObject($select);

$results = $statement->execute();

$resultSet = new ResultSet();

$resultSet->initialize($results);

$result = $resultSet->toArray();