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

时间:2015-04-08 21:40:47

标签: php pdo ms-access-2007 rowcount

我有一个奇怪的问题,一直在踢我的背后。

我有以下代码:

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

2 个答案:

答案 0 :(得分:2)

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

  

PDOStatement :: rowCount()返回受影响的行数   最后由相应的DELETE,INSERT或UPDATE语句执行   PDOStatement对象。   如果关联的PDOStatement执行的最后一个SQL语句是   一个SELECT语句,一些数据库可能会返回行数   由该声明返回。但是,无法保证此行为   适用于所有数据库,不应依赖于便携式数据库   应用

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

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

$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());

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

答案 1 :(得分:-1)

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

$number_of_rows = iterator_count($ps);