【问题标题】:get number of rows with pdo使用 pdo 获取行数
【发布时间】:2012-10-23 03:40:00
【问题描述】:

我有一个简单的 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];

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

对此有何想法或解释?

【问题讨论】:

    标签: mysql pdo rows


    【解决方案1】:

    你可以用这个

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

    【讨论】:

      【解决方案2】:

      尝试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";
      }
      

      【讨论】:

      • 这将为他提供每次提取的列数,即 2。 PDOStatement::fetch() 返回单行。 PDOStatement::fetchAll() 将整个结果集作为数组返回
      • 这就是问题要问的“回声似乎正在通过查询返回记录的 ID 值,not the number of records returned?”
      • 虽然我认为他看起来并不需要查询内容,所以最好使用 SQL count()
      • 返回的记录数!==每条记录的列数。
      • @Smudger:听起来您可以正常执行查询,然后使用count($rows) 看看它是否找到任何东西,我会扩大答案。
      【解决方案3】:

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

      您根本没有获取行数。

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

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

      编辑: 请参阅@ray 的回答。对于 InnoDB,使用 count(id) 优于 count(*)


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

      $row_count = $result->rowCount();
      

      但请注意:

      如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,某些数据库可能会返回行数 由该语句返回。但是,不能保证这种行为 适用于所有数据库,不应依赖于便携式 应用程序。

      Documentation

      【讨论】:

      • 谢谢,完美运行。我的问题在我的身体里我使用while($row = $result-&gt;fetch(PDO::FETCH_ASSOC)) 获取返回的结果我怎么能用一个mysql 查询来完成两者,还是每个函数都需要两个?再次感谢。
      • 我不确定。你能用你的旧查询试试$row_count = $result-&gt;rowCount();吗?有人报告说 PDO_MySQL 驱动程序允许它工作,尽管文档另有说明。
      • 如果这不起作用,我认为您仍然可以在遍历行时计算 PHP 中的行数,在 fetch 中。不知道这有多糟糕。
      • 您说您也在使用查询的内容,这是否意味着您现在运行 2 个查询,一个用于行数,一个用于实际数据?
      【解决方案4】:

      假设id是主键使用:

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

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

      【讨论】:

      • 您确定会影响性能吗? This answer 另有说法,对于 mysql。
      • @Cthulhu 我敢肯定。 MyISAM 可以在同一时间内执行 count() 和 count(id) 如果 id 是一个 PK(内存表也可以与 count() 一起使用),但是如果您的表是 Innodb 存储引擎你要开枪了:mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables
      【解决方案5】:

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

      如果要计数,请执行 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 2012-08-19
        • 2012-12-11
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 2015-05-07
        相关资源
        最近更新 更多