从 mysql 切换到 PDO 我注意到 fetch 方法会改变 PDO 对象本身!举个例子:
$res=$ps->fetchAll();
echo($res[0]['Mail']); //it'ok
//now i re-call the fetch method
$res=$ps->fetchAll();
echo($res[0]['Mail']); //no result!
为什么会这样?在mysql中我从未见过这个东西
该对象仍然包含您的数据,但它维护一个指向当前记录的内部指针。每次从结果集中获取记录时,指针都会前进到下一行。
在 的情况下fetchAll()
,指针已前进到结果集的末尾,因此后续fetchAll()
调用不返回任何结果。
如果需要fetchAll()
再次调用,可以将指针回退到结果集的开头。这可以在缓冲查询上完成:
$ps->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
$ps->rewind();
$ps->fetchAll();
fetch
返回所有剩余/可用的行,如果没有更多的行可用,它将返回FALSE
;并将fetchAll
在一次尝试中返回所有可用行,随后的调用将返回FALSE
,因为结果集中没有更多数据。
我们可以$res
在上面的示例中重用数组。
您需要知道做什么fetch*
:
当您从 PDO 向数据库发起查询时,数据库会过滤其数据以将您请求的数据的结果集组合在一起。这可能涉及从硬盘读取数据,将其放入内存并保留一段时间。对于大型结果集,这些是花费的大量资源。当您fetch()
来自 PDO 时,一个单一的结果会从数据库的内部缓冲区复制到 PHP/PDO 的内部缓冲区,并作为数据数组返回给您。当您fetch()
再次调用时,您会得到下一个结果,依此类推。
获取结果后,数据库可以释放该内存。客户(你)得到了它要求的数据,所以数据库可以将它从内存中删除。您不能fetch()
再次使用相同的数据;出于效率原因。
fetchAll()
一次获取所有结果并返回一个大数组。这与以下内容相同:
$result = array();
while ($row = $pdo->fetch()) {
$result[] = $row;
}
您也不能再次执行上述操作。
在mysql
中,与此相同:
$result = array();
while ($row = mysql_fetch_assoc($resultSet)) {
$result[] = $row;
}
你也不能再这样做了。
您可以回退数据库中的结果集指针,以明确告诉它再次读取它已经读取的内容,但这可能非常低效,应该避免。为了使您的应用程序保持快速运行,您应该只在必要时来回传输尽可能少的数据,并且一次在内存中存储尽可能少的数据。