【问题标题】:Prepared Statements - Number of Rows准备好的语句 - 行数
【发布时间】:2013-05-19 12:38:45
【问题描述】:

我只是想弄清楚如何确定行数,然后在 HTML 中显示该数字。

我准备好的语句如下所示:

if($stmt = $mysqli -> prepare("SELECT field1, field2, field3 FROM table WHERE id= ?ORDER BY id ASC")) 
    {
    /* Bind parameters, s - string, b - blob, i - int, etc */
    $stmt -> bind_param("i", $id);
    $stmt -> execute();
    
    /* Bind results */
    $stmt -> bind_result($testfield1, $testfield2, $testfield3);
    
    /* Fetch the value */
    $stmt -> fetch();

    /* Close statement */
    $stmt -> close();
   }

我知道我应该先保存结果,然后使用num_rows,像这样:

$stmt->store_result();
$stmt->num_rows;

但是,我正在运行,并且当我将代码放在那里时页面出现问题。我什至无法进入如何显示行数的下一步

在计算准备好的语句中的行数方面我缺少什么,那么我将如何用<?php echo '# rows: '.$WHATGOESHERE;?> 显示它

【问题讨论】:

    标签: php mysqli prepared-statement


    【解决方案1】:

    num_rows 返回数字,你必须将它存储在一个变量中。

    /*.....other code...*/
    $numberofrows = $stmt->num_rows;
    /*.....other code...*/
        
    echo '# rows: '.$numberofrows;
    

    所以完整的代码应该是这样的:

    $stmt = $mysqli -> prepare("SELECT field1, field2, field3 FROM table WHERE id= ? ORDER BY id ASC");
    /* Bind parameters, s - string, b - blob, i - int, etc */
    $stmt -> bind_param("i", $id);
    $stmt -> execute();
    $stmt -> store_result();
    
    /* Bind results */
    $stmt -> bind_result($testfield1, $testfield2, $testfield3);
    
    /* Fetch the value */
    $stmt -> fetch();
    $numberofrows = $stmt->num_rows;
    
    /* Close statement */
    $stmt -> close();
    
    echo '# rows: '.$numberofrows;
    

    【讨论】:

    • 它在我发布的准备好的声明中的什么地方?在执行()之后?在 bind_result 之后,还是 fetch?有关系吗?
    • @Kevin 我不这么认为。只要确保它在执行之后就可以了,应该没问题
    • 哦,顺便说一句,您忘记了 ?ORDER BY 之间的空格。我会更新我的答案来解决这个问题
    • @kp,谢谢。至少现在没有出现这种情况。但是,当查询实际产生 2 个结果时,它给了我 1 行的结果。你看到什么明显的我失踪了吗?否则,我将作为另一个问题深入研究。感谢您的帮助
    • 另外,我认为这个 '$stmt->store_result();'需要在 num_rows 行之前添加。
    【解决方案2】:

    如果您只对行数感兴趣而不是实际的数据行,这里有一个完整的查询块,在 SELECT 子句中调用了COUNT(*)

    $conn = new mysqli("host", "user", "pass", "db");
    $stmt = $conn->prepare("SELECT COUNT(*) FROM `table` WHERE id= ?");
    $stmt->bind_param("s", $id);
    $stmt->execute();
    $stmt->bind_result($num_rows);
    $stmt->fetch();
    echo $num_rows;
    

    或者,如果您想在迭代/处理行之前知道行数,一种方法是将整个结果集(多维数组)集中到一个变量中并在迭代之前调用 count()

    $conn = new mysqli("host", "user", "pass", "db");
    $sql = "SELECT field1, field2, field3
            FROM table
            WHERE id= ?
            ORDER BY id";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    $resultset = $result->fetch_all(MYSQLI_ASSOC);
    echo "<div>Num: " , count($resultset) , "</div>";
    foreach ($resultset as $row) {
        echo "<div>Row: {$row['field1']} & {$row['field2']} & {$row['field3']}</div>";
    }
    

    *我已经在我的本地主机上测试了上述两个 sn-ps。

    【讨论】:

      【解决方案3】:

      这适用于 2020 年 2 月

      $number_of_records = $stmt->rowCount();
      echo $number_of_records;
      

      来自 php.net 手册:

      PDOStatement::rowCount() 返回受 a 影响的行数 DELETE、INSERT 或 UPDATE 语句。

      这是他们网站上的example

      <?php
      /* Delete all rows from the FRUIT table */
      $del = $dbh->prepare('DELETE FROM fruit');
      $del->execute();
      
      /* Return number of rows that were deleted */
      print("Return number of rows that were deleted:\n");
      $count = $del->rowCount();
      print("Deleted $count rows.\n");
      ?>
      

      上面的例子会输出:

      Return number of rows that were deleted:
      Deleted 9 rows.
      

      【讨论】:

      • OP 没有从删除查询中询问受影响的行。这是另一个问题的正确答案。
      【解决方案4】:

      在此处查看示例 #2: PHP.net

      使用 PDO::query() 发出 SELECT COUNT(*) 语句,其谓词与预期的 SELECT 语句相同,然后使用 PDOStatement::fetchColumn() 检索将返回的行数。然后,您的应用程序可以执行正确的操作。

      【讨论】:

      • 我建议使用 num_rows 而不是执行完整的语句
      • num_rows() 是与选择 COUNT(*)@Vincent 的查询配对的错误调用。
      • 这个答案价值不高,因为解决方案取决于研究人员必须离开 SO 才能看到解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2012-12-01
      • 2016-03-23
      相关资源
      最近更新 更多