5

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

有没有人找到解决方法?

4

3 回答 3

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 扩展实际上在幕后所做的事情;这是获得该计数的唯一方法。

于 2009-08-22T01:28:14.813 回答
6

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

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

于 2009-04-20T20:54:14.400 回答
2

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

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

于 2009-05-22T17:08:53.783 回答