PHP表单提交复选框数组时$candCurso未定义无法插入数据库
报错根因
浏览器提交表单时,如果同组复选框没有任何选项被选中,不会携带该组复选框的name字段到请求体中,此时PHP的$_POST超全局数组里不存在curso键,直接执行$candCurso = $_POST['curso']就会触发「Undefined array key "curso"」的报错,后续遍历$candCurso的逻辑自然不会执行。
修复方案
按优先级给可直接落地的修复方式:
- 后端参数兜底(必做,最稳妥)
接收curso参数时先做存在性判断,不存在则赋值为空数组,从根源解决未定义报错:
之后在执行遍历前加一层数组校验,避免异常值进入循环:// 替换原有 $candCurso = $_POST['curso']; 代码 // PHP7.0+ 可以用空合并运算符,写法更简洁 $candCurso = $_POST['curso'] ?? []; // 低版本PHP用isset判断 // $candCurso = isset($_POST['curso']) ? $_POST['curso'] : [];if($result){ $lastID = mysqli_insert_id($link); // 确认是有效非空数组再遍历 if (is_array($candCurso) && count($candCurso) > 0) { foreach($candCurso as $value) { // 强转课程ID为整数,过滤非法参数 $curId = intval($value); if ($curId <= 0) continue; $data = date('Y-m-d'); $sql = "INSERT INTO tbl_professor_curso(cand_id, cur_id, data_admissao) VALUES ({$lastID}, {$curId}, '{$data}')"; $rr = mysqli_query($link, $sql); } } } - 前端辅助兜底(可选,不推荐单独用)
可以在所有name="curso[]"的复选框前加一个同名隐藏域,强制即使没有勾选任何复选框,也会向后端提交curso参数:
注意这种方式提交的数组会多一个空字符串元素,后端遍历必须过滤空值,否则会插入无效数据,不如纯后端兜底可靠。<!-- 放在复选框组最前面 --> <input type="hidden" name="curso[]" value="">
严重风险提示
当前所有数据库操作都是直接拼接用户输入到SQL语句中,没有做参数转义、也没有使用预处理语句,存在极高危的SQL注入漏洞,攻击者可以通过构造恶意请求拖库、篡改甚至删除全表数据,建议尽快把所有写入逻辑替换为mysqli预处理或者PDO预处理,禁止直接拼接未经过滤的用户输入到SQL中。
内容的提问来源于stack exchange,提问作者Diogo Brandão
相关产品推荐
相关产品推荐

