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

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

你有什么建议吗?


当前回答

这篇文章是旧的,但获得行计数在php与PDO是简单的

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();

其他回答

看看这个链接: http://php.net/manual/en/pdostatement.rowcount.php 不建议在SELECT语句中使用rowCount() !

正如经常发生的那样,这个问题让人非常困惑。人们来这里有两个不同的任务:

它们需要知道表中有多少行 它们需要知道查询是否返回了任何行

这是两个完全不同的任务,没有任何共同之处,不能用同一个函数来解决。具有讽刺意味的是,对于它们都必须使用实际的PDOStatement::rowCount()函数。

让我们看看为什么

计算表中的行数

在使用PDO之前,我只是简单地使用mysql_num_rows()。

Means you already did it wrong. Using mysql_num_rows() or rowCount() to count the number of rows in the table is a real disaster in terms of consuming the server resources. A database has to read all the rows from the disk, consume the memory on the database server, then send all this heap of data to PHP, consuming PHP process' memory as well, burdening your server with absolute no reason. Besides, selecting rows only to count them simply makes no sense. A count(*) query has to be run instead. The database will count the records out of the index, without reading the actual rows and then only one row returned.

出于这个目的,在接受的答案中建议的代码是公平的,只是它不会是一个“额外的”查询,而是要运行的唯一查询。

计算返回的行数。

第二个用例不是灾难性的,而是毫无意义的:如果您需要知道您的查询是否返回任何数据,您总是拥有数据本身!

例如,如果您只选择一行。好了,你可以使用被取的行作为标志:

$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
    echo 'No data found';
}

如果您需要获取很多行,那么您可以使用fetchAll()。

fetchAll()是我不想要的东西,因为我有时可能要处理大型数据集

是的,当然,对于第一个用例,它将是两倍的糟糕。但是,正如我们已经了解到的,不要只选择行来计数它们,无论是使用rowCount()还是fetchAll()。

但是如果您真的要使用所选的行,那么使用fetchAll()并没有什么错。记住,在一个web应用程序中,你不应该选择大量的行。只有在网页上实际使用的行应该被选择,因此你必须在SQL中使用LIMIT, WHERE或类似的子句。对于这样少量的数据,可以使用fetchAll()。同样,在条件中使用这个函数的结果:

$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
    echo 'No data found';
}

当然,运行一个额外的查询只是为了告诉您的另一个查询是否返回任何行,这绝对是疯狂的,就像它在顶部的两个答案中所建议的那样。

计算大结果集中的行数

在这种需要选择大量行(例如在控制台应用程序中)的罕见情况下,您必须使用无缓冲的查询,以减少内存使用量。但这是rowCount()不可用的实际情况,因此这个函数也没有用处。

因此,这是您可能需要运行额外查询的唯一用例,以防您需要知道所选行数的接近估计值。

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

请记住,您不能获取两次结果。您必须将获取结果保存到数组中,按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
    }                       
}

如果你只是想获得行数(而不是数据),即。在预处理语句中使用COUNT(*),那么你所需要做的就是检索结果并读取值:

$sql = "SELECT count(*) FROM `table` WHERE foo = bar";
$statement = $con->prepare($sql); 
$statement->execute(); 
$count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
return reset($count); // Resets array cursor and returns first value (the count)

实际上,检索所有行(数据)来执行简单的计数是一种资源浪费。如果结果集很大,您的服务器可能会因此阻塞。

当它是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