有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。
fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。
你有什么建议吗?
有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。
fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。
你有什么建议吗?
当前回答
正如我之前在回答一个类似问题时所写的,mysql_num_rows()工作的唯一原因是它在内部获取所有行以提供信息,即使您不认为它是这样的。
所以在PDO中,你的选项是:
使用PDO的fetchAll()函数将所有行获取到数组中,然后对其使用count()。 按照karim79的建议,对SELECT COUNT(*)执行额外的查询。 使用MySQL的FOUND_ROWS()函数,除非查询有SQL_CALC_FOUND_ROWS或LIMIT子句(在这种情况下,查询返回的行数和FOUND_ROWS()返回的行数可能不同)。但是,此函数已弃用,并将在将来删除。
其他回答
最后我用了这个:
$result = $db->query($query)->fetchAll();
if (count($result) > 0) {
foreach ($result as $row) {
echo $row['blah'] . '<br />';
}
} else {
echo "<p>Nothing matched your query.</p>";
}
这篇文章是旧的,但获得行计数在php与PDO是简单的
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
$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;
}
正如我之前在回答一个类似问题时所写的,mysql_num_rows()工作的唯一原因是它在内部获取所有行以提供信息,即使您不认为它是这样的。
所以在PDO中,你的选项是:
使用PDO的fetchAll()函数将所有行获取到数组中,然后对其使用count()。 按照karim79的建议,对SELECT COUNT(*)执行额外的查询。 使用MySQL的FOUND_ROWS()函数,除非查询有SQL_CALC_FOUND_ROWS或LIMIT子句(在这种情况下,查询返回的行数和FOUND_ROWS()返回的行数可能不同)。但是,此函数已弃用,并将在将来删除。