2009-04-20 59 views
5

所以我一直使用PHP的PDO作为一会儿我的数据库转到类现在,不幸的是今天调试了一会一个客户端的服务器(与PHP 5.2.6后安装)我发现this。我们尝试升级到最新的稳定版本(5.2.9),但问题依然存在。PDO的rowCount时()在PHP 5.2.6+不工作

有没有人找到解决方法?

+0

我不确定你在找什么,你打电话给affected_rows(),并返回一个选择语句为零?选择不会影响任何行。 – 2009-04-20 19:43:54

+0

我在去年寻找一个相当于mysql_num_rows() – 2009-04-20 20:43:38

+0

的PDO,你是如何解决的? – Strae 2010-06-21 18:46:52

回答

6

您可以通过使用the FOUND_ROWS() function,不知道是否有没有更好的方法做到这一点通过MySQL的本身。

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

1

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

相反,你可以使用使用fetchall()到一个数组,然后计数()。

8

该数据库可以给你的行数的计数的唯一方法是通过运行查询和计算的行数。

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扩展实际上是在盖下;这是获得这一数字的唯一方法。