繁体   English   中英

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

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

所以我一直在使用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扩展实际上正在做的事情; 这是实现这一目标的唯一途径。

您可以通过使用FOUND_ROWS()函数通过MySQL本身来完成 ,不确定是否有更好的替代方案。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM