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是布尔值,不是结果集。
解决方案
如果你想要在插入数据后,把刚插入的记录显示出来,正确的做法是:
- 确认INSERT执行成功后,通过
mysqli_insert_id($conn)获取刚插入记录的自增ID(假设你的sensor表的id是自增主键)。 - 用这个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
相关产品推荐
相关产品推荐

