Php 此结果是仅向前的结果集,不支持在向前移动后调用rewind()
在Zend app中,我使用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\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();