PDO的rowCount()不适用于PHP 5.2.6+

时间:2009-04-20 19:27:52

标签: php pdo

所以我一直在使用PHP的PDO作为我的数据库goto类,不幸的是今天在客户端的服务器上调试了一段时间后(安装了PHP 5.2.6)我发现this。我们尝试升级到最新的稳定版本(5.2.9),但问题仍然存在。

有没有人找到解决方法?

3 个答案:

答案 0 :(得分:10)

数据库可以计算行数的唯一方法是运行查询并计算行数。

默认情况下,mysql扩展使用缓冲查询模式,导致整个数据集在控制返回给PHP之前被提取到内存中,并且可以开始处理行。

默认情况下,PDO使用无缓冲模式,这会导致页面加载时间延迟降低,这通常是您想要的。权衡是rowCount()在获取整个数据集之前不会返回有效信息。

那么你如何得到这个数字呢?

易:

$q = $db->query("SELECT ...");
$rows = $q->fetchAll();
$rowCount = count($rows);
echo "There are $rowCount rows\n";
foreach ($rows as $row) {
    print_r($row);
}
  

但是这很糟糕,因为它查询前面的所有行并使我的页面加载速度变慢,旧的mysql扩展没有这个问题!?

但这正是旧的mysql扩展实际上正在做的事情;这是实现这一目标的唯一途径。

答案 1 :(得分:6)

你可以使用the FOUND_ROWS() function通过MySQL本身来做,不确定是否有更好的选择。

编辑:似乎这是MySQL可能实现的唯一原因是因为它在内部获取了所有结果行并对其进行了缓冲,以便能够为您提供此信息。见mysql_unbuffered_query()。如果您使用该函数而不是mysql_query()mysql_num_rows()函数将无效。如果在使用PDO时确实需要知道行数,可以将PDO中的所有行提取到数组中,然后使用count()

答案 2 :(得分:1)

请注意,不应将rowCount()用于SELECT查询,因为PDOStatement-> rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。

相反,您可以将fetchAll()用于数组,然后使用count()。