php - 使用 PDO 有效地获取带有 WHERE 子句的 SELECT 查询返回的行数

标签 php mysql pdo count rowcount

numerous discussions on SO关于如何在使用 PDO 运行 SELECT 查询时获取返回的行数。虽然大多数(包括 PHP manual )建议使用两个查询,第一个运行 COUNT(),但我还没有看到有人建议如何使用带有 WHERE 的准备好的语句轻松地做到这一点 子句。

我如何最有效地(在处理和代码行数方面)使用相同的 WHERE 子句运行 COUNT()?准备好的查询已经指定了列。 fetchAll() 在这里不起作用,因为它无法扩展;如果我必须返回数百万行,使用 fetchAll 处理它会非常慢。

例如,没有计数:

$sql = "SELECT
            FirstName,
            LastName
        FROM
            People
        WHERE
            LastName = :lastName";
$query = $pdoLink->prepare($sql);
$query->bindValue(":lastName", '%Smith%');
$query->execute();      
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    echo $row['FirstName'] . " " . $row['LastName'];
}

我看了看只是将 COUNT(ID) 添加到 SELECT 子句,让它只是一个查询,但看起来没有真正好的方法(或不是特定于数据库的方式)倒回 fetch() 一旦我从中得到一行。

另一种解决方案是使 WHERE 子句成为自己构建的变量。但是,这似乎不是很有效。它正在准备两个查询,重新绑定(bind)值,然后执行。

像这样:

$whereClause = " WHERE
                   LastName = :lastName";

$rowsSql = "SELECT
            COUNT(ID) As NumOfRows
        FROM
            People " . $whereClause;
$rowsQuery = $pdoLink->prepare($sql);
$rowsQuery->bindValue(":lastName", '%Smith%');
$rowsQuery->execute();
if ($rowsQuery->fetchColumn() >= 1)
    //Prepare the original query, bind it, and execute it.
    $sql = "SELECT
                FirstName,
                LastName
            FROM
                People " . $whereClause;
    $query = $pdoLink->prepare($sql);
    $query->bindValue(":lastName", '%Smith%');
    $query->execute();      
    while($row = $query->fetch(PDO::FETCH_ASSOC)) {
        echo $row['FirstName'] . " " . $row['LastName'];
    }
}
else
{
    //No rows found, display message
    echo "No people found with that name.";
}

最佳答案

使用 MySQL 时,PDOStatement::rowCount()返回结果集中的行数。它实际上calls底层 mysql_num_rows() C 函数来填充值。无需多次查询或任何其他困惑。

这对 MySQL 来说是正确的,但其他驱动程序不能依赖这种行为(其他人可能支持它但不能保证,我对其他人的熟悉程度不足以肯定地说任何一种方式)。但由于您的问题专门针对 MySQL,因此它应该符合您的目的。

关于php - 使用 PDO 有效地获取带有 WHERE 子句的 SELECT 查询返回的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887692/

相关文章:

PHP 在每 4 条记录后循环添加 <div "style="clear"> </div>

php - 如何在 Bootstrap Modal 中传递 GET 变量?

php - 调用非对象的成员函数 bindValue()。 PHP 版本不同?

php - 如何使用 PHP 7 和 MySQL 将文件从 POST 插入到 longblob 列中?

php - 生产和 XAMPP 上的不同 css

php - 获取 "Integrity constraint violation: 1048 Column ' payment_id' cannot be null"using Doctrine & Symfony

mysql - Db::实例 prestashop

php - 使用 PDO 的准备语句获取数据库记录

php - 使用 html/php 值发布复选框并非在所有情况下都有效

mysql - 如何在加载到 MySQL 时自动转换时区