有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。
fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。
你有什么建议吗?
有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。
fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。
你有什么建议吗?
当前回答
快速一行程序返回第一个条目。这对于非常基本的查询是很好的。
<?php
$count = current($db->query("select count(*) from table")->fetch());
?>
参考
其他回答
你可以将最好的方法合并到一行或函数中,并自动生成新的查询:
function getRowCount($q){
global $db;
return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn();
}
$numRows = getRowCount($query);
回答这个问题是因为我现在知道了这个问题,也许它会有用。
请记住,您不能获取两次结果。您必须将获取结果保存到数组中,按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
}
}
这太迟了,但我遇到了一个问题,我这样做:
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();
这真的很简单。:)
要在查询中使用变量,必须使用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
正如经常发生的那样,这个问题让人非常困惑。人们来这里有两个不同的任务:
它们需要知道表中有多少行 它们需要知道查询是否返回了任何行
这是两个完全不同的任务,没有任何共同之处,不能用同一个函数来解决。具有讽刺意味的是,对于它们都必须使用实际的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()不可用的实际情况,因此这个函数也没有用处。
因此,这是您可能需要运行额外查询的唯一用例,以防您需要知道所选行数的接近估计值。