有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。

fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。

你有什么建议吗?


当前回答

因此,其他答案已经确定不应该使用rowCount()来计算SELECT语句的行数。文档甚至说:

PDOStatement::rowCount()返回受相应PDOStatement对象执行的最后一个DELETE、INSERT或UPDATE语句影响的行数。

https://web.archive.org/web/20220409162106/https://www.php.net/manual/en/pdostatement.rowcount.php

所以对于其他查询是可以的,但是对于SELECT就不太好了。大多数答案建议您进行两个查询,一个用于统计行数,另一个用于获取所需记录的子集。但是,您可以在一个请求中查询行数和您的数据子集。这有点像打高尔夫球的代码练习,但是如果请求时间有点昂贵,并且这些请求是经常发出的,那么实际上可以证明比两个请求更有效。

如果你在PostgreSQL中,你可以提供干净的JSON输出,如下所示:

WITH mytable as (VALUES(1,2,3),(4,5,6),(7,8,9),(10,11,12))
SELECT
    jsonb_build_object(
        'rowcount', (SELECT count(1) FROM mytable)
        ,'data', (
            SELECT jsonb_agg(data.*)
            FROM (
                SELECT *
                FROM mytable
                WHERE column1 > 1 -- pagination offset
                ORDER BY column1
                LIMIT 2 -- page size
            ) as data
        )
    ) jsondata

输出:

{"data": [
    {
      "column1": 4,
      "column2": 5,
      "column3": 6
    },
    {
      "column1": 7,
      "column2": 8,
      "column3": 9
    }
  ],
"rowcount": 4
}

如果你不在postgres中,这些函数将不可用,但你可以这样做:

WITH mytable as (VALUES(1,2,3),(4,5,6),(7,8,9),(10,11,12))
SELECT
    (SELECT count(1) FROM mytable) as rowcount
    ,data.*
FROM (
    SELECT *
    FROM mytable as mytable(column1, column2, column3)
    WHERE column1 > 1 -- pagination offset
    ORDER BY column1
    LIMIT 2 -- page size
) as data

但是它会返回每一行的行数,这可能有点浪费:

rowcount column1 column2 column3
4 4 5 6
4 7 8 9

其他回答

要在查询中使用变量,必须使用bindValue()或bindParam()。并且不要将变量与"连在一起。$variable。”

$statement = "SELECT count(account_id) FROM account
                  WHERE email = ? AND is_email_confirmed;";
$preparedStatement = $this->postgreSqlHandler->prepare($statement);
$preparedStatement->bindValue(1, $account->getEmail());
$preparedStatement->execute();
$numberRows= $preparedStatement->fetchColumn();

GL

这太迟了,但我遇到了一个问题,我这样做:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

这真的很简单。:)

有一个简单的解决办法。如果你使用PDO连接到你的DB,像这样:

try {

    $handler = new PDO('mysql:host=localhost;dbname=name_of_your_db', 'your_login', 'your_password'); 
    $handler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) { 

    echo $e->getMessage();
}

现在,如果你想知道你的表中有多少行,并且你有列'id'作为主键,对DB的查询将是:

$query = $handler->query("SELECT id FROM your_table_name");

最后,要获得与查询匹配的行数,可以这样写:

$amountOfRows = $query->rowCount();

或者你可以这样写:

$query = $handler ->query("SELECT COUNT(id) FROM your_table_name");

$amountOfRows = $query->rowCount();

或者,如果你想知道表'products'中有多少产品的价格在10到20之间,写这样的查询:

$query = $handler ->query("SELECT id FROM products WHERE price BETWEEN 10 AND 
20");

$amountOfRows = $query->rowCount();

快速一行程序返回第一个条目。这对于非常基本的查询是很好的。

<?php
$count = current($db->query("select count(*) from table")->fetch());
?>

参考

这是一个老帖子,但正在沮丧地寻找替代方案。非常不幸的是,PDO缺少这个特性,特别是PHP和MySQL往往是齐头并进的。

使用fetchColumn()有一个不幸的缺陷,因为当fetchColumn()将指针移动到下一行时,您不能再使用该结果集(有效地)。举个例子,如果你有一个类似于

水果- - - >香蕉 水果——>苹果 水果- - - >橙色

如果你使用fetchColumn(),你可以发现有3个水果返回,但如果你现在循环的结果,你只有两列,fetchColumn()的价格是损失的第一列结果,只是找出多少行被返回。这会导致草率的编码,如果实现的话,结果会完全错误。

所以现在,使用fetchColumn(),你必须实现一个全新的调用和MySQL查询,只是为了得到一个新的工作结果集。(希望自你上次提问以来没有改变),我知道,不太可能,但这是可能发生的。此外,所有行数验证上的双重查询的开销。对于这个例子来说,这是很小的,但是在一个连接查询上解析200万行,这不是一个令人愉快的代价。

我热爱PHP,支持每一个参与PHP开发的人,以及日常使用PHP的社区,但真的希望在未来的版本中能够解决这个问题。这是我对PHP PDO“真正”唯一的不满,否则它是一个伟大的类。