【问题标题】:PHP PDO - Num RowsPHP PDO - 行数
【发布时间】:2011-02-11 15:19:35
【问题描述】:

PDO 显然无法计算从选择查询返回的行数(mysqli 具有num_rows 变量)。

除了使用count($results->fetchAll())之外,有没有办法做到这一点?

【问题讨论】:

  • stackoverflow.com/questions/460010/… 的可能重复项 - 这个问题和你的一样。接受的答案就是你想要的。
  • 我看到了这个问题,但答案很糟糕。对数据库运行第二个查询只是为了查看现在存储在记录集中的行数真的很愚蠢。

标签: php mysql pdo


【解决方案1】:

最简单的

  $stmt = $datalink->query('SELECT * FROM projects');
  $rows = $stmt->fetchAll();
  $num_rows = count($rows);
  echo $num_rows ;

【讨论】:

  • 事实上是最可怕的。并非每个数据库都是一个人最喜欢的宠物的愚蠢列表。有些包含数千和数百万行。
【解决方案2】:

虽然 PDO 显然可以计算从 mysql 的选择查询返回的行数,但更重要的是,这种函数首先没有用

每次你想到使用 rowCount() 进行 SELECT 查询时,它要么是多余的,要么是有害的。见PDO rowCount()

  • 如果您已经选择了数据,则此功能是多余的,因为您只需计算数据即可
  • 如果您只想使用此功能来获取计数,这将是有害的,因为您永远不应选择仅用于计数的数据。仅选择计数,改为使用 SELECT count(*)。

【讨论】:

  • 你有没有读过这个问题的公认答案?来自 PDO 的文档:“如果关联 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,不能保证所有数据库都可以使用此行为,因此不应依赖于便携式应用程序。”
  • 好吧,如果您要的是便携式应用程序,那么请不要用 mysql 标记您的问题。
  • 那我该怎么数数呢?我稍后在 HTML 文档中使用 PHP MySQL 查询来显示数据库中的数据,但是我要显示计数的元素是在获取和显示数据之前出现的???
【解决方案3】:

另一个可能更接近mysqli 中的num_rows 变量和对应的C API 函数mysql_num_rows() 的选项。就是使用MySQL函数FOUND_ROWS()返回相同的信息,而不必重新统计结果中的所有记录。

例子:

$pdoDB->query('SELECT FOUND_ROWS()')->fetchColumn()

【讨论】:

  • 这个答案现在没有任何意义,因为你可以用常规方式进行计数
【解决方案4】:

根据手册,有一个PDOStatement->rowCount方法;但它不应该被使用 (quoting) :

对于大多数数据库, PDOStatement::rowCount() 没有 返回受影响的行数 SELECT 声明。
相反,使用 PDO::query() 发出 SELECT COUNT(*) 相同的声明 谓词作为您的预期SELECT 声明,然后使用 PDOStatement::fetchColumn() 到 检索将 被退回。
然后您的应用程序可以 执行正确的操作。


如果您已经有一个记录集,并且想知道其中有多少行,则必须使用fetch* 方法之一来获取数据;并使用 count - 就像你建议的那样。

【讨论】:

  • 是的,这就是我的问题。 PDO 没有 怎么可能有 num_rows 函数?那里的所有其他数据库连接器库都有它。
  • 如果你有数据,你可以自己计算它包含的行数(就像你建议的那样);所以我想没有真正的需要一种可以做到这一点的方法......
  • 为了计数而获取所有数据,然后将那个数组扔掉是非常浪费的,尤其是如果它是一个大数组..
  • 这就是为什么我说"如果你已经有一个记录集" ;如果您不这样做,并且想知道您的查询可以给出多少行,那么当不使用 LIMIT 子句时,我会说另一个带有 count() 的查询是您正在寻找的解决方案?
  • FWIW,没有连接器可以在不获取行数的情况下为您提供准确的行数。即使在 MySQL C API 调用mysql_num_rows() 中,在获取所有行之前也无法获得计数。见dev.mysql.com/doc/refman/5.1/en/mysql-num-rows.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多