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

Posted

技术标签:

【中文标题】PHP PDO rowCount 在 SELECT 语句上返回 -1【英文标题】:PHP PDO rowCount returns -1 on SELECT statement 【发布时间】:2015-04-08 21:40:46 【问题描述】:

我有一个奇怪的问题,一整天都在折磨我。

我有以下代码:

$today = date("m/d/Y");
$sql = "SELECT * FROM msgs WHERE is_errata = 0 AND kill_date >= '$today' AND msg_date <= '$today' ORDER BY msg_date";
$ps = $pdo->prepare($sql);
if (!$ps) 
    echo "PDO::errorInfo():";
    print_r($pdo->errorInfo());
else
    $ps->execute();
    $number_of_rows = $ps->rowCount();

当我显示 $number_of_rows 的值时,它总是显示 -1,即使我得到结果。

其他人有这个问题吗?

哦,我使用的数据库不是 mysql,而是可爱的 MS Access。我怀疑这可能是问题所在。

【问题讨论】:

【参考方案1】:

rowCount() 方法不会从SELECT 语句返回行数。这是常见的错误。

PDOStatement::rowCount() 返回受 相应的最后执行的 DELETE、INSERT 或 UPDATE 语句 PDOStatement 对象。 如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,某些数据库可能会返回行数 由该语句返回。但是,不能保证这种行为 适用于所有数据库,不应依赖于便携式 应用程序。

您可以在documentation 中找到更多详细信息。

因此,要获取行数,您必须使用 sql COUNT(*) 函数编写 SELECT 语句。在你的情况下:

$sql = "SELECT COUNT(*) AS `count` FROM msgs WHERE is_errata = 0 AND kill_date >= '$today' AND msg_date <= '$today' ORDER BY msg_date";

或使用 php

$number_of_rows = count($ps->fetchAll());

您还应该学习以正确的方式准备查询

【讨论】:

在此之后我无法使用“foreach”进行迭代。有什么解决办法吗?【参考方案2】:

您应该使用iterator_count 来计算行数,即

$number_of_rows = iterator_count($ps);

【讨论】:

以上是关于PHP PDO rowCount 在 SELECT 语句上返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

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

PDO rowCount 仅返回一个 [重复]

PDO rowCount() 支持的数据库

Php pdo rollBack() 不适用于更新语句

PDO rowCount()始终返回1

PHP PDO Select 查询返回双精度值