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

PHP表单提交复选框数组时$candCurso未定义无法插入数据库

报错根因

浏览器提交表单时,如果同组复选框没有任何选项被选中,不会携带该组复选框的name字段到请求体中,此时PHP的$_POST超全局数组里不存在curso键,直接执行$candCurso = $_POST['curso']就会触发「Undefined array key "curso"」的报错,后续遍历$candCurso的逻辑自然不会执行。
报错截图

修复方案

按优先级给可直接落地的修复方式:

  1. 后端参数兜底(必做,最稳妥)
    接收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);
            }
        }
    }
    
  2. 前端辅助兜底(可选,不推荐单独用)
    可以在所有name="curso[]"的复选框前加一个同名隐藏域,强制即使没有勾选任何复选框,也会向后端提交curso参数:
    <!-- 放在复选框组最前面 -->
    <input type="hidden" name="curso[]" value="">
    
    注意这种方式提交的数组会多一个空字符串元素,后端遍历必须过滤空值,否则会插入无效数据,不如纯后端兜底可靠。

严重风险提示

当前所有数据库操作都是直接拼接用户输入到SQL语句中,没有做参数转义、也没有使用预处理语句,存在极高危的SQL注入漏洞,攻击者可以通过构造恶意请求拖库、篡改甚至删除全表数据,建议尽快把所有写入逻辑替换为mysqli预处理或者PDO预处理,禁止直接拼接未经过滤的用户输入到SQL中。

内容的提问来源于stack exchange,提问作者Diogo Brandão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:18:16