PDO 的 rowCount() 在 PHP 5.2.6+ 上不起作用 [重复]

PDO's rowCount() Not Working on PHP 5.2.6+ [duplicate]

提问人:Andrew G. Johnson 提问时间:4/21/2009 更新时间:10/26/2010 访问量:11691

问:

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

有没有人找到解决方法?

PHP 的PDO协议

评论

0赞 Chad Birch 4/21/2009
我不确定您在寻找什么,您正在调用 affected_rows() 并为 select 语句返回零?选择不会影响任何行。
0赞 Andrew G. Johnson 4/21/2009
我正在寻找相当于 mysql_num_rows() 的 PDO
0赞 Strae 6/22/2010
在过去的一年里,你是怎么解决的?

答:

6赞 Chad Birch 4/21/2009 #1

您可以使用 FOUND_ROWS() 函数通过 MySQL 本身来做到这一点,不确定是否有更好的选择。

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

评论

2赞 Bill Karwin 4/21/2009
+1 在获取所有行之前,甚至 MySQL C API 也无法告诉您行数。
0赞 Andrew G. Johnson 4/21/2009
好吧,rowCount() 仅在您返回结果后运行,所以我相信它们已经被获取了
0赞 Fatimaezzahra Rarhibou 9/4/2018
从 PDO 获取所有行后,我尝试了 count(),但仍然不起作用!上述解决方案似乎都不适合我
2赞 German 5/23/2009 #2

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

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

10赞 Wez Furlong 8/22/2009 #3

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

默认情况下,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赞 Strae 6/22/2010
我遇到了同样的问题,并用这个技巧“解决”了。fetchAll ... count()
0赞 Bailey Parker 7/24/2012
我正在开发一个应用程序并想依赖 ,但不确定为什么它不可信。正要发布一个问题,但你的回答足以涵盖它。+1 给你先生rowCount()