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值,而不是查询返回的记录数?

对此有任何想法或解释吗?

4

5 回答 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;
于 2012-11-02T13:16:26.380 回答
9

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

您根本没有获取行数。

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

此查询将返回总行数$rows[0];

编辑: 请参阅@ray 的回答。usingcount(id)count(*)InnoDB 更好。


您可以从之前的查询中以下列方式获取行数。

$row_count = $result->rowCount();

但请注意:

如果关联 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,不能保证所有数据库都具有此行为,并且不应依赖于可移植应用程序。

文档

于 2012-11-02T13:15:40.030 回答
3

假设id是主键使用:

 SELECT COUNT(id) FROM coursescompleted WHERE person=:p;

避免计数(*)。如果您的存储引擎是 InnoDB(可能是除 MyIsam 之外的其他引擎),您的性能会受到影响。

于 2012-11-02T13:24:52.367 回答
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";
}
于 2012-11-02T13:15:13.883 回答
-3

你可以用这个

<?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 手册中

于 2016-02-16T10:22:50.217 回答