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

动态添加讲师后PHP接收id_relator报错及多讲师存储咨询

解决课程录入表单的两个核心问题

咱们一步步来搞定你遇到的问题:先修复那个「Undefined index」的报错,再解决多讲师的数据库存储方案。

一、修复「Undefined index: relational_id」错误

首先看你的报错,本质是表单字段名与PHP变量不匹配+未处理多讲师的数组提交:

1. 调整表单讲师选择框的名称为数组格式

你当前的讲师选择框name="p_name",但要支持多个讲师,必须把name改成数组形式p_name[],这样PHP才能接收到多个讲师ID的集合。修改初始的select标签:

<select name="p_name[]" id="p_name" class="form-control" style="height: 50px">
    <option value=''>Elija un relator</option>
    <?php 
    $query = $mysqli -> query ("SELECT id_relator, nombre_relator FROM relatores"); 
    while ($valores = mysqli_fetch_array($query)) { 
        echo '<option value="'.$valores[id_relator].'">'.$valores[nombre_relator].'</option>'; 
    } 
    ?>
</select>

你的dynamicForm插件会自动生成带前缀的新选择框,只要初始的name是数组格式,新生成的也会保持p_name[]的格式。

2. 修正PHP的变量接收逻辑

你原来的PHP代码里用了$id_relatores,但这个变量根本没从$_POST里获取,而且表单提交的字段是p_name,所以要改成:

// 先获取讲师ID数组,过滤掉空选项(用户没选的情况)
$relator_ids = isset($_POST['p_name']) ? array_filter($_POST['p_name']) : [];

// 验证至少选择一位讲师
if(empty($relator_ids)){
    scriptAlert('请至少选择一位讲师!', '#');
    exit;
}

这样就不会出现Undefined index的报错了。

二、多讲师数据的数据库存储方案

课程和讲师是多对多关系(一个课程可以有多个讲师,一个讲师可以讲多个课程),不能把多个讲师ID塞进cursos表的单个字段里,正确的做法是创建一个中间关联表:

1. 创建关联表

先在数据库里创建curso_relatores表,用来关联课程和讲师:

CREATE TABLE curso_relatores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    curso_id INT NOT NULL,
    relator_id INT NOT NULL,
    -- 关联cursos表的主键(假设你的cursos表主键是id_curso)
    FOREIGN KEY (curso_id) REFERENCES cursos(id_curso),
    -- 关联relatores表的主键
    FOREIGN KEY (relator_id) REFERENCES relatores(id_relator),
    -- 避免同一讲师重复绑定同一课程
    UNIQUE KEY unique_curso_relator (curso_id, relator_id)
);

2. 修改PHP的存储逻辑

先插入课程的基础数据到cursos表,然后获取刚插入的课程ID,再循环把每个讲师ID插入到关联表:

// 修正课程名称重复检查的逻辑(原代码判断$result集是否为null是错误的)
$curso_check = mysqli_query($con, "SELECT nombre_curso FROM cursos WHERE nombre_curso = '$nombre_curso'");
if(mysqli_num_rows($curso_check) > 0){
    scriptAlertGo('El nombre del curso ya esta registrado en la base de datos', '#');
    exit;
}

// 插入课程基础数据(注意字段名要和你的cursos表完全对应)
$sql_curso = "INSERT INTO capacitaciones.cursos 
              (nombre_curso, fechas_curso, horas_curso, id_ambito, codigo_sigper, vacantes, ubicacion, descripcion, disponible) 
              VALUES ('$nombre_curso', '$fecha_curso', '$numero_horas', '$ambito', '$sigper', '$vacantes', '$ubicacion', '$descripcion', 'si')";

if (mysqli_query($con, $sql_curso)) {
    // 获取刚插入的课程ID
    $curso_id = mysqli_insert_id($con);
    
    // 循环插入每个讲师的关联记录
    foreach($relator_ids as $relator_id){
        $sql_relator = "INSERT INTO capacitaciones.curso_relatores 
                       (curso_id, relator_id) 
                       VALUES ('$curso_id', '$relator_id')";
        mysqli_query($con, $sql_relator);
    }
    
    scriptAlertGo('!El curso fue inscrito correctamente!', '#');
} else {
    scriptAlert('!Ha ocurrido un problema en la inscripción, por favor intente nuevamente!', '#');
}

3. 重要提醒:防止SQL注入

你当前的代码存在严重的SQL注入风险,所有用户输入的变量直接拼进SQL语句里了,强烈建议改用预处理语句,示例如下:

// 预处理插入课程
$stmt_curso = $con->prepare("INSERT INTO cursos (nombre_curso, fechas_curso, horas_curso, id_ambito, codigo_sigper, vacantes, ubicacion, descripcion, disponible) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt_curso->bind_param("ssisissss", $nombre_curso, $fecha_curso, $numero_horas, $ambito, $sigper, $vacantes, $ubicacion, $descripcion, 'si');
$stmt_curso->execute();
$curso_id = $stmt_curso->insert_id;
$stmt_curso->close();

// 预处理插入关联表
$stmt_relator = $con->prepare("INSERT INTO curso_relatores (curso_id, relator_id) VALUES (?, ?)");
$stmt_relator->bind_param("ii", $curso_id, $relator_id);
foreach($relator_ids as $relator_id){
    $stmt_relator->execute();
}
$stmt_relator->close();

三、表单提交前的小优化

可以在JS里加个验证,确保用户至少选了一位讲师:

$('form').on('submit', function(event) {
    // 检查是否有至少一个讲师被选择
    var hasSelectedRelator = false;
    $('select[name="p_name[]"]').each(function(){
        if($(this).val() !== ''){
            hasSelectedRelator = true;
            return false; // 跳出循环
        }
    });
    
    if(!hasSelectedRelator){
        alert('Por favor, elija al menos un relator!');
        event.preventDefault();
        return;
    }

    // 原有的序列化代码...
    var values = {};
    $.each($('form').serializeArray(), function(i, field) {
        values[field.name] = field.value;
    });
    console.log(values)
    event.preventDefault();
})

内容的提问来源于stack exchange,提问作者Juan Salinas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:51:44