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

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

你有什么建议吗?


当前回答

回答这个问题是因为我现在知道了这个问题,也许它会有用。

请记住,您不能获取两次结果。您必须将获取结果保存到数组中,按count($array)获取行计数,并使用foreach输出结果。 例如:

$query = "your_query_here";
$STH = $DBH->prepare($query);
$STH->execute();
$rows = $STH->fetchAll();
//all your results is in $rows array
$STH->setFetchMode(PDO::FETCH_ASSOC);           
if (count($rows) > 0) {             
    foreach ($rows as $row) {
        //output your rows
    }                       
}

其他回答

$sql = "SELECT count(*) FROM `table` WHERE foo = ?"; 
$result = $con->prepare($sql); 
$result->execute([$bar]); 
$number_of_rows = $result->fetchColumn(); 

这不是最优雅的方式,而且它涉及到一个额外的查询。

PDO有PDOStatement::rowCount(),这显然在MySql中不起作用。真痛苦。

来自PDO文档:

对于大多数数据库, PDOStatement::rowCount()没有 返回受影响的行数 SELECT语句。相反,使用 PDO::query()发出SELECT COUNT(*)语句 谓词作为您想要的SELECT 语句,然后使用 PDOStatement: fetchColumn () 检索需要的行数 被归还。您的应用程序可以 请执行正确的操作。

编辑:上面的代码示例使用了一个预处理语句,在许多情况下,这对于计数行的目的可能是不必要的,因此:

$nRows = $pdo->query('select count(*) from blah')->fetchColumn(); 
echo $nRows;

当你在mysql语句中使用COUNT(*)时,比如in

$q = $db->query("SELECT COUNT(*) FROM ...");

你的mysql查询已经在计算结果的数量,为什么在php中再次计数?来获得mysql的结果

$q = $db->query("SELECT COUNT(*) as counted FROM ...");
$nb = $q->fetch(PDO::FETCH_OBJ);
$nb = $nb->counted;

$nb将包含你在mysql语句中计算的整数 写起来有点长,但执行起来很快

编辑: 对不起,错误的帖子,但作为一些例子显示查询与计数在,我建议使用mysql的结果,但如果你不使用计数在sql fetchAll()是有效的,如果你保存在一个变量的结果,你不会失去一行。

$data = $dbh->query("SELECT * FROM ...");
$table = $data->fetchAll(PDO::FETCH_OBJ);

Count ($table)将返回行数,您仍然可以使用像$row = $table[0]或使用foreach后的结果

foreach($table as $row){
  print $row->id;
}

因此,其他答案已经确定不应该使用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

当它是mysql的问题,如何计算或获得多少行在一个表与PHP PDO我使用这个

// count total number of rows
$query = "SELECT COUNT(*) as total_rows FROM sometable";
$stmt = $con->prepare($query);

// execute query
$stmt->execute();

// get total rows
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['total_rows'];

感谢Mike @ codeofaninja.com

正如我之前在回答一个类似问题时所写的,mysql_num_rows()工作的唯一原因是它在内部获取所有行以提供信息,即使您不认为它是这样的。

所以在PDO中,你的选项是:

使用PDO的fetchAll()函数将所有行获取到数组中,然后对其使用count()。 按照karim79的建议,对SELECT COUNT(*)执行额外的查询。 使用MySQL的FOUND_ROWS()函数,除非查询有SQL_CALC_FOUND_ROWS或LIMIT子句(在这种情况下,查询返回的行数和FOUND_ROWS()返回的行数可能不同)。但是,此函数已弃用,并将在将来删除。