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