You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mysqli_num_rows参数错误:需mysqli_result却传入布尔值问题排查

问题原因分析

你遇到的核心问题是混淆了不同SQL语句的返回值类型:

  • 当执行INSERT、UPDATE、DELETE这类修改数据的语句时,mysqli_query()返回的是布尔值(成功返回true,也就是你看到的1;失败返回false),它不会返回mysqli_result结果集对象。
  • 而mysqli_num_rows()和mysqli_fetch_array()都是专门用来处理**查询类语句(比如SELECT)**返回的结果集的,把布尔值传给它们自然会触发参数类型错误。

哪怕你移除了mysqli_num_rows(),后续的mysqli_fetch_array($que)也会报错,因为$que是布尔值,不是结果集。

解决方案

如果你想要在插入数据后,把刚插入的记录显示出来,正确的做法是:

  1. 确认INSERT执行成功后,通过mysqli_insert_id($conn)获取刚插入记录的自增ID(假设你的sensor表的id是自增主键)。
  2. 用这个ID执行一条SELECT语句,获取对应的结果集,再用mysqli_num_rows()和mysqli_fetch_array()处理。

另外,你的代码存在严重的SQL注入风险,直接把$_GET的变量拼接到SQL里非常危险,建议改用预处理语句来避免这个问题。

修正后的代码示例

$val = $_GET["val"];
$tval = $_GET["tval"];
$res = ($val < $tval) ? "less " : "exreme ";

// 改用预处理语句防止SQL注入
$sql1 = "INSERT INTO sensor (val,tval,result) VALUES (?,?,?)";
$stmt = mysqli_prepare($conn, $sql1);
mysqli_stmt_bind_param($stmt, "sss", $val, $tval, $res);
$que = mysqli_stmt_execute($stmt);

if($que) {
    // 获取刚插入记录的自增ID
    $insertedId = mysqli_insert_id($conn);
    // 查询刚插入的记录
    $selectSql = "SELECT id, val, tval, result FROM sensor WHERE id = ?";
    $selectStmt = mysqli_prepare($conn, $selectSql);
    mysqli_stmt_bind_param($selectStmt, "i", $insertedId);
    mysqli_stmt_execute($selectStmt);
    $result = mysqli_stmt_get_result($selectStmt);
    
    if(mysqli_num_rows($result) > 0) {
        while ($data = mysqli_fetch_array($result)) {
            echo "<tr>";
            echo "<td>".$data['id']."</td><td>".$data['val']."</td> <td>".$data['tval']."</td><td>".$data['result']."</td>";
            echo"</tr>";
        }
    } else {
        echo "nooooooo";
    }
}
额外提示
  • 以后区分清楚:写操作(INSERT/UPDATE/DELETE)用返回的布尔值判断成功与否;读操作(SELECT/SHOW等)才会返回结果集,用结果集处理函数去操作。
  • 始终使用预处理语句处理用户输入,避免SQL注入攻击。

内容的提问来源于stack exchange,提问作者Debashree Bardhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:07:01