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

And*_*son 5 php pdo

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

有没有人找到解决方法?

Wez*_*ong 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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


Cha*_*rch 6

您可以通过使用FOUND_ROWS()函数来完成MySQL本身,不确定是否有更好的替代方案.

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

  • +1在获取所有行之前,甚至MySQL C API都不能告诉您行数. (2认同)