向表插入外键时出现mysqli_num_rows()参数错误求助
解决mysqli_num_rows()参数错误与外键约束插入问题
嘿,作为PHP新手碰到这个问题太正常了,我来一步步帮你拆解和解决~
先搞懂错误原因
你看到的mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given错误,本质是:你调用mysqli_num_rows()的时候,传进去的不是有效的查询结果集,而是布尔值false。
为什么会传false?因为你的SQL插入语句(尤其是涉及外键约束的)执行失败了,mysqli_query()会返回false,而你没做任何检查就直接把这个结果传给了mysqli_num_rows()。
另外要注意:mysqli_num_rows()是用来统计SELECT查询返回的行数的,插入、更新、删除操作根本不需要用这个函数!这类操作应该用mysqli_affected_rows()来获取受影响的行数。
常见的失败原因(尤其是外键相关)
- 外键约束不满足:你要插入的外键值在关联的父表中不存在。比如你给
order表插入user_id=100,但users表中根本没有id=100的记录,数据库就会触发外键约束,导致插入失败。 - SQL语法错误:比如字段名写错、值的格式不对(日期格式不匹配等)、参数没传全。
- POST参数不完整:你的代码里
isset($_POST["..."])没写完,可能有必要的参数没获取到,导致插入的值缺失。
修复步骤与示例代码
1. 给SQL执行加错误检查
每次执行SQL后,先判断是否成功,失败时输出详细错误信息,这是调试的关键:
// 假设你的插入SQL是这样的 $sql = "INSERT INTO work_orders (workOrderName, submitted_on, status, subject, foreign_key_col) VALUES ('{$_POST['workOrderName']}', '{$_POST['submitted_on']}', '{$_POST['status']}', '{$_POST['subject']}', '{$_POST['foreign_key']}')"; $result = mysqli_query($con, $sql); // 先检查查询是否成功 if (!$result) { // 输出数据库返回的具体错误,比如外键约束错误 die("插入失败: " . mysqli_error($con)); } // 插入成功后,用affected_rows获取行数,而不是num_rows echo "插入成功,共插入 " . mysqli_affected_rows($con) . " 条记录";
2. 改用预处理语句(更安全,避免SQL注入)
直接拼接POST参数到SQL里很容易有安全问题,建议用预处理语句,同时也能避免很多语法错误:
<?PHP include_once('connection.php'); /** * created by chandu on 24-03-2018 12:20 pm */ $con = mysqli_connect($server_name, $user_name, $password, $db); if (!$con) { die("连接错误: " . mysqli_connect_error()); // 输出更详细的连接错误 } // 确保所有必要的POST参数都存在 if (isset($_POST["workOrderName"], $_POST["submitted_on"], $_POST["status"], $_POST["subject"], $_POST["foreign_key"])) { // 预处理SQL,用?作为占位符 $stmt = mysqli_prepare($con, "INSERT INTO work_orders (workOrderName, submitted_on, status, subject, foreign_key_col) VALUES (?, ?, ?, ?, ?)"); // 绑定参数:第一个参数是类型(s=字符串,i=整数,d=浮点数),后面对应每个占位符的变量 mysqli_stmt_bind_param($stmt, "ssssi", $_POST["workOrderName"], $_POST["submitted_on"], $_POST["status"], $_POST["subject"], $_POST["foreign_key"]); // 执行语句并检查结果 if (mysqli_stmt_execute($stmt)) { echo "插入成功!受影响行数: " . mysqli_affected_rows($con); } else { echo "插入失败,错误信息: " . mysqli_stmt_error($stmt); // 如果是外键约束错误,这里会显示类似"Cannot add or update a child row: a foreign key constraint fails..."的提示 } mysqli_stmt_close($stmt); } else { die("缺少必要的表单参数,请检查提交的内容"); } mysqli_close($con); ?>
3. 排查外键约束问题
如果错误提示是外键相关的,你需要:
- 确认你插入的外键值在关联的父表中确实存在
- 检查外键字段的数据类型是否和父表的主键类型一致(比如父表主键是INT,外键字段不能是VARCHAR)
- 确认父表的主键没有被删除或者修改
关键总结
- 永远在执行SQL后检查结果,失败时输出错误信息,这是快速定位问题的核心
- 插入/更新/删除操作别用
mysqli_num_rows(),改用mysqli_affected_rows() - 外键约束失败时,先验证外键值的有效性,再检查表结构是否匹配
- 用预处理语句代替直接拼接SQL,既安全又能减少语法错误
内容的提问来源于stack exchange,提问作者Chandu
相关产品推荐
相关产品推荐

