我正在使用Zend_Db_Table_Abstract的具体实现:
class DB_TestClass extends Zend_Db_Table_Abstract {
protected $_name = "test.TestData";
}
如果我想要选择表格中的所有行,我似乎有一个选项:
$t = new DB_TestClass;
$rowset = $t->fetchAll();
这将返回Zend_Db_Table_Rowset的一个实例,它有一个可循环的接口,可以循环访问每个行条目作为rowClass实例:
foreach($rowset as $row) {
var_dump($row);
}
但是,行集已经将数据库中的每一行都加载到内存中(!)在小型表上这没关系,但是在大型表 - 例如数千行 - 它很快耗尽了PHP可用的内存并且脚本死掉了
我如何使用Zend_Db迭代结果集,一次从语句句柄中检索一行,ala mysql_fetch_assoc()?这样可以在不占用过多内存的情况下有效访问任意数量的行(数千,数百万)。
提前感谢任何建议。
答案 0 :(得分:3)
然后fetchAll()无法满足您的需求。 您需要使用Zend_Db_Select来获取所有记录,然后通过循环执行您想要的操作
$select = new Zend_Db_Select ($this->getFrontController()->getParam('bootstrap')->getResource ('Db'));
$statement = $select->from ('verses')->query ();
$statement->execute ();
while ($row = $statement->fetch ())
{
// try something like that
$db_row = new Zend_Db_Table_Row (array ('table' => $table, 'data' => $row));
$db_row->text = $db_row->text . '_';
$db_row->save ();
}
答案 1 :(得分:1)
您能指定一起获取所有行的目的吗?因为如果你想对表中的所有行进行某种处理,那么你需要将所有行放到内存中。另一方面,如果你想做像分页这样的事情,你总是可以使用zend_pagination对象来获取有限的no。一次排。或者更好的是你可以设置偏移量而不是。要在fetchAll函数本身中获取的行。