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


PHP PDO rowCount returns -1 on SELECT statement

我遇到了一个奇怪的问题,这个问题一直困扰着我。

我有以下代码:

$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。我怀疑这可能是问题所在。

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

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

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

因此,要获得行数,必须使用sqlCOUNT(*)函数编写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());

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

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

$number_of_rows = iterator_count($ps);