动态添加讲师后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
相关产品推荐
相关产品推荐

