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

Posted

技术标签:

【中文标题】PDO 的 rowCount() 不适用于 PHP 5.2.6+【英文标题】:PDO's rowCount() Not Working on PHP 5.2.6+ 【发布时间】:2010-10-20 15:57:00 【问题描述】:

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

有没有人找到解决方法?

【问题讨论】:

我不确定您在寻找什么,您正在调用affected_rows() 并为选择语句返回零?选择不会影响任何行。 我正在寻找与 mysql_num_rows() 等效的 PDO 去年,你是怎么解决的? 【参考方案1】:

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

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(),但不确定为什么它不可信。正要发布一个问题,但您的回答已经充分涵盖了它。 +1 先生【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

+1 在获取所有行之前,即使是 MySQL C API 也无法告诉您行数。 好吧 rowCount() 仅在您返回结果后运行,所以我相信它们已经被获取了 我在从 PDO 获取所有行后尝试了 count() 但仍然不起作用!以上解决方案似乎都不适合我

以上是关于PDO 的 rowCount() 不适用于 PHP 5.2.6+的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO Update语句总是返回0行受影响的rowCount()

PHP PDO rowCount 在 SELECT 语句上返回 -1

pdo-odbc 不适用于绑定值,nvarchar 和 text 在等于运算符中不兼容

PDO rowCount() 支持的数据库

PDO 案例存在不适用于绑定参数

lastInsertId() 在插入操作中不适用于 PDO 对象[关闭]