解决PHP5的PDO行数MySQL问题

解决PHP5的PDO行数MySQL问题,php,pdo,Php,Pdo,我最近开始了一个使用PHP5的新项目的工作,并希望使用他们的PDO类。问题是MySQL PDO驱动程序不支持rowCount,因此无法运行查询,然后获取受影响的行数或返回的行数,就我而言,这是一个相当大的问题。我想知道以前是否有人处理过这个问题,你做了些什么来解决这个问题。在我看来,必须执行fetch或fetchAll来检查是否有任何行受到影响或返回似乎是一种黑客行为,我宁愿只执行$stmt->numRows或类似操作。您可以在原始SELECT查询之后立即发出SELECT FOUND\u row

我最近开始了一个使用PHP5的新项目的工作,并希望使用他们的PDO类。问题是MySQL PDO驱动程序不支持rowCount,因此无法运行查询,然后获取受影响的行数或返回的行数,就我而言,这是一个相当大的问题。我想知道以前是否有人处理过这个问题,你做了些什么来解决这个问题。在我看来,必须执行fetch或fetchAll来检查是否有任何行受到影响或返回似乎是一种黑客行为,我宁愿只执行$stmt->numRows或类似操作。

您可以在原始SELECT查询之后立即发出SELECT FOUND\u rows查询来获取行数

$pdo->query("SELECT * FROM users");
$foundRows = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();

另请参见:

对于那些使用MySQL存储过程的人来说,这种解决方案实际上并不可行。我建议您做的是让存储过程创建两个行集。第一个将包含一行和一列,其中包含记录数。第二个是用于获取该数量行的记录集

无限行数可以是SELECT COUNT*,其中WHERE子句与第二行集完全相同,但不包含LIMIT/OFFSET子句


另一个想法是创建一个临时表。使用SELECT语句填充临时表。然后,您可以将SELECT COUNT*FROM tmpTable用于第一行集,并将SELECT COUNT*FROM tmpTable用于第二行集。

这个问题基于几个错误的假设和一个过时的陈述

首先,不要混淆受影响行和选定行的数量。PDO早在09年就支持前者

说到SELECT语句返回的行数,您不需要那个数字。你拥有的数据足够了


是的,现在rowCount也支持从mysql中选择的行数。不过,在一般的web应用程序中,您并不需要这个数字。

有一个问题,rowCount对我来说很好,在SELECT语句中也是如此。自从这个问题被回答后,这项功能就已经实现了吗?@Imran rowCount对我来说同样适用于select以及SHOW TABLES之类的查询。我使用的是PHP5.2.6。我不知道我的Pecl版本。如何检查?这可能是PHP5.2.6+的问题吗?发现此问题-rowCount仅在您以前执行过fetchAll时工作正常,但如果您使用的是fetch则不行,因为它消耗的内存要少得多。这是一个糟糕的答案,因为它需要两个查询而不是一个查询,并且第一个查询可能是一个完整的表扫描。很多时候,您只是想知道是否存在某个示例,比如用户名冲突。使用SELECT…LIMIT 1,然后查看结果集的行数是否超过零,这比COUNT*快得多。我依赖于MySQL的行数,但在任何获取之前都要这样做。要显示正确数量的SELECT结果,不需要在rowCount之前fetchAll。这在PHP5.4中似乎不是问题。有人能证实吗?你不认为使用临时表来获得这样一个无用的数字有点过分吗?你不需要那个数字。你拥有的数据足够了。哦,天哪。。翻译成你不需要电子邮件地址。有一个网站就足够了!我几乎总是需要这个数字,当我可以只计算查询本身时,就避免使用多个计数查询。如果是这样的话,最好告诉用户没有找到条目,而不是什么都不循环。此外,在使用while循环时,您不能检查fetch是否返回true