pei*_*iam 10 php zend-framework zend-db
假设我有
$db is an instance of Zend_Db_Adapter_Abstract and
$sql = 'SELECT blah blah FROM table' will return a huge number of records.
有两个代码片段来处理返回的数据,如下所示.
// Code fragment 1 (let's call it C1).
$results = $db->fetchAll($sql);
foreach ($results as $row) {
    // Process $row
}
// Code fragment 2 (let's call it C2).
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
    // Process $row
}
我的理解是C1会将所有返回的数据加载到$ results.因此,大量数据被加载到PHP内存中.以下是我的问题.
谢谢!
tim*_*dev 16
你的预感是正确的.至少如果你正在使用PDO驱动程序, - > fetch()读取未缓冲的结果,而 - > fetchAll()返回大数组中的所有数据.
请注意,如果您使用 - > fetch(),则必须小心您在循环中尝试执行的操作.当您仍然拥有无缓冲的结果集时,无法在同一连接上运行其他查询.
所以,如果你的计划是在循环中更新那些相同的行,你需要找到一种方法来延迟执行更新(通过排队然后以某种方式),直到你退出循环.
The*_*pha 10
要从结果集中检索一行,请使用语句对象的fetch()方法.参考
$sql = 'SELECT blah blah FROM table';
$stmt = $db->query($sql);
while ($row = $stmt->fetch()) {
    // Process $row
}
在上面的例子$stmt = $db->query($sql);中resultset,在内存中检索并fetch用于从中获取循环中的当前行resultset,这将光标移动到下一行,直到它到达最后一行resultset.
要在一个步骤中检索结果集的所有行,请使用fetchAll()方法.这相当于在循环中调用fetch()方法并返回数组中的所有行.
$sql = 'SELECT blah blah FROM table';
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
echo $rows[0]['col1']; // The first field/column from the first row
或者你可以使用
....
$table = new Mytable();
// Find a single row Returns a Rowset
$rows = $table->find(1234);
// Find multiple rows Also returns a Rowset
$rows = $table->find(array(1234, 5678));
参考: Zend_Db_Table..
更多信息: 获取一行..
我认为fetchAll()更快,因为它在一个步骤中检索所有数据并返回一个数组但消耗更多内存但fetch()消耗更少的内存但逐个检索数据.
获取操作的API已被取代,以允许Zend_Db_Table_Select对象修改查询.但是,fetchRow()和fetchAll()方法的弃用用法将继续工作而不进行修改.
更多参考: 这里.