0

从 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中我从未见过这个东西

4

3 回答 3

4

该对象仍然包含您的数据,但它维护一个指向当前记录的内部指针。每次从结果集中获取记录时,指针都会前进到下一行。

在 的情况下fetchAll(),指针已前进到结果集的末尾,因此后续fetchAll()调用不返回任何结果。

如果需要fetchAll()再次调用,可以将指针回退到结果集的开头。这可以在缓冲查询上完成:

$ps->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
$ps->rewind();
$ps->fetchAll();
于 2013-05-18T11:27:38.547 回答
1

fetch返回所有剩余/可用的行,如果没有更多的行可用,它将返回FALSE;并将fetchAll在一次尝试中返回所有可用行,随后的调用将返回FALSE,因为结果集中没有更多数据。

我们可以$res在上面的示例中重用数组。

于 2013-05-18T11:27:52.810 回答
0

您需要知道做什么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;
}

你也不能再这样做了。


可以回退数据库中的结果集指针,以明确告诉它再次读取它已经读取的内容,但这可能非常低效,应该避免。为了使您的应用程序保持快速运行,您应该只在必要时来回传输尽可能少的数据,并且一次在内存中存储尽可能少的数据。

于 2013-05-18T11:47:17.513 回答