使用PDO获取行数

12

我有一个简单的PDO预处理查询:

$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rows = $result->fetch(PDO::FETCH_NUM);
echo $rows[0];

回声似乎返回的是记录的ID值,而不是查询返回的记录数量?

对此有什么想法或解释吗?

5个回答

18

您已经执行了一个从数据库返回行的查询,将结果中的第一行获取到变量中,然后输出该行的第一列。

如果您想要计数,请使用 SQL count() 函数。

$result = $db->prepare("select count(*) from coursescompleted where person=:p"); 
$result->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rowCount = $result->fetchColumn(0);
echo $rowCount;

11

PDO::FETCH_NUM: 返回一个数组,其索引为结果集中返回的列号,从0列开始。

您根本没有获取行计数。

SELECT COUNT(*) FROM coursescompleted where person=:p

这个查询将返回 $rows[0] 的总行数。

编辑:请参考 @ray 的回答。在InnoDB中使用 count(id) 比使用 count(*) 更好。


您可以通过以下方式从先前的查询中获取行数。

$row_count = $result->rowCount();

但是请注意:

如果相关的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,则有些数据库可能会返回该语句返回的行数。然而,并不保证所有数据库都会表现出这种行为,因此不应该依赖于它来编写可移植的应用程序。

文档


谢谢,非常完美。我的问题在于我使用while($row = $result->fetch(PDO::FETCH_ASSOC))获取返回的结果,如何用单个mysql查询实现两者或者我需要为每个函数都使用两个查询?再次感谢。 - Smudger
我不确定。你能否尝试在旧查询中使用 $row_count = $result->rowCount();?有些人报告说,尽管文档上说不行,但 PDO_MySQL 驱动程序允许这样做。 - Anirudh Ramanathan
如果那不起作用,我认为你仍然可以在 PHP 中迭代行时计算行数,在 fetch 中。不确定这有多糟糕。 - Anirudh Ramanathan
你说你现在也使用查询的内容,这是否意味着你现在运行了两个查询,一个用于行计数,另一个用于实际数据? - Martin Lyne

3
假设 id 是主键,使用以下代码:
 SELECT COUNT(id) FROM coursescompleted WHERE person=:p;

避免使用 count(*)。如果你的存储引擎是InnoDB(可能除了MyIsam之外的其他存储引擎),那么性能会受到影响。

你确定会有性能损失吗?这个答案说对于mysql来说并非如此。 - Anirudh Ramanathan
1
@Cthulhu 我很确定。如果id是主键,MyISAM可以在同样的时间内执行count()和count(id)(内存表对于count()也很好),但如果你的表使用Innodb存储引擎,你会自讨苦吃:http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ - Ray

0
尝试使用 echo count($rows);,因为 $rows 是一个数组。

编辑:

要使用结果。

$rows = $result->fetchAll(/* nothing here */);
if(count($rows) > 0) {
  // Show results, perhaps using a foreach($rows as $row)
} else {
 echo "Sorry, no results found";
}

1
这将给他提供每次获取的列数,即2。PDOStatement :: fetch()返回单个行。 PDOStatement :: fetchAll()将整个结果集作为数组返回。 - Stephen
1
这个问题是在问:“回显似乎返回的是记录的ID值,而不是查询返回的记录数?” - Martin Lyne
虽然我认为他似乎并不需要查询内容,因此使用SQL的count()更好。 - Martin Lyne
1
@Smudger:听起来你可以正常执行查询,然后使用 count($rows) 来查看是否找到了任何内容,我会稍微扩展一下答案。 - Martin Lyne
使用PHP 7.1和PDO库,这是唯一不会对代码产生干扰的方法。从PHP 5.6移植过来,没有简单的方法来获取numRows。rowCount()返回-1,所以那样行不通。 - Michael Fever
显示剩余2条评论

-2

你可以使用这个

<?php
$result = $db->prepare("select id, course from coursescompleted where person=:p"); 
$result ->bindParam(':p', $q, PDO::PARAM_INT);
$result->execute();
$rows = $result->rowCount();
echo $rows;
?>

这在SELECT查询中有时不起作用。但根据个人经验,并且您没有提到将其移植到其他数据库系统,它应该可以在MySQL上工作。

更多信息请参阅PHP手册此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接