提问人:Andrew G. Johnson 提问时间:4/21/2009 更新时间:10/26/2010 访问量:11691
PDO 的 rowCount() 在 PHP 5.2.6+ 上不起作用 [重复]
PDO's rowCount() Not Working on PHP 5.2.6+ [duplicate]
问:
因此,我已经使用PHP的PDO作为我的数据库goto类一段时间了,不幸的是,今天在客户端服务器(安装了PHP 5.2.6)上调试了一段时间后,我发现了这一点。我们尝试升级到最新的稳定版本(5.2.9),但问题仍然存在。
有没有人找到解决方法?
答:
您可以使用 FOUND_ROWS()
函数通过 MySQL 本身来做到这一点,不确定是否有更好的选择。
编辑:似乎MySQL能够做到这一点的唯一原因是因为它在内部获取所有结果行并缓冲它们,以便能够为您提供此信息。参见 mysql_unbuffered_query()。
如果使用该函数而不是 ,则该函数将不起作用。如果您在使用 PDO 时确实需要知道行数,则可以将 PDO 中的所有行提取到数组中,然后使用 .mysql_query()
mysql_num_rows()
count()
评论
请注意,不应将 rowCount() 用于 SELECT 查询,因为 PDOStatement->rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。
相反,您可以在数组中使用 fetchAll(),然后使用 count()。
数据库可以为您提供行数计数的唯一方法是运行查询并计算行数。
默认情况下,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 扩展实际上在幕后所做的;这是获得该计数的唯一方法。
评论
fetchAll ... count()
rowCount()
评论