【问题标题】:Prepared statements: num_rows is always zero [duplicate]准备好的语句:num_rows 始终为零 [重复]
【发布时间】:2016-10-06 09:41:40
【问题描述】:

我正在将我的网站转换为准备好的语句(在我只是依赖一个包含 mysqli_real_escape_string 等的自定义函数之前),但是当我运行代码时,我总是得到零记录。我知道 SQL 很好,因为我可以在 MySQL 工作台工具中运行 SQL,它会返回几条记录。这是我的代码:

<?php
$link = new mysqli($server,$dbusername,$dbpassword,$database);
if($link->connect_error){
    die($link->connect_error);
}

$sql = "select itemname from items where itemcategory = ?";
//if(!$query = mysqli_query($link, $sql)) die(mysqli_error($link));
if(!$stmt = $link->prepare($sql)) die("Error");

$stmt->bind_param("i", $category); //replace question mark with category id
$stmt->execute();
$stmt->bind_result($itemname);
//$numitems = mysqli_num_rows($query);
$numitems = $stmt->num_rows;

if($numitems>0){
    //while($array = mysqli_fetch_array($query)){
    while($stmt->fetch()) {
        echo $itemname."<br>";
    }
}
$stmt->close();
?>

$stmt-&gt;num_rows 始终为 0。我做错了什么?

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

    这个问题实际上记录在mysqli_stmt_num_rows的php文档中

    返回结果集中的行数。 mysqli_stmt_num_rows()的使用取决于你是否使用mysqli_stmt_store_result()来缓冲语句句柄中的整个结果集。

    因此,由于结果尚未传输到语句句柄,因此您无法正确计算行数。这就是为什么解决方案就像您提到的那样:

    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($itemname);
    $numitems = $stmt->num_rows;
    

    【讨论】:

      【解决方案2】:

      我的问题通过改变解决了

      $stmt->execute();
      $stmt->bind_result($itemname);
      

      $stmt->execute();
      $stmt->store_result();
      $stmt->bind_result($itemname);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-18
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 2021-06-24
        相关资源
        最近更新 更多