如何将复选框值更新到MySQL数据库?执行后course_fk重复问题
问题分析与解决方案
你的问题根源很明确:每次循环执行的UPDATE语句都会修改该学生所有选课记录的course_fk,最后循环结束时,所有记录都会被最后一次迭代的$fmc值覆盖(也就是你看到的26)。
举个具体的过程:当循环到$fmc=18时,所有匹配student_fk的行的course_fk都变成18;接着循环到20时,又把所有行改成20……直到最后一次循环的26,自然所有行都是同一个值了。
正确的实现思路
如果你的需求是替换该学生的全部选课列表(即用新选中的课程覆盖旧的),正确的做法应该是:
- 先删除该学生现有的所有选课记录
- 再将新选中的课程逐个插入到
enrollments表中
基础版代码(字符串拼接,注意SQL注入风险)
// 先处理学生ID的转义,避免SQL注入 $studentid = mysqli_real_escape_string($con, $_POST["id"]); // 第一步:删除该学生已有选课记录 $deleteSql = "DELETE FROM enrollments WHERE student_fk = '$studentid'"; mysqli_query($con, $deleteSql); // 第二步:插入新的选课记录 $fmcourse = $_POST['fm_courses']; foreach($fmcourse as $fmc) { $cleanFmc = mysqli_real_escape_string($con, $fmc); $insertSql = "INSERT INTO enrollments (student_fk, course_fk) VALUES ('$studentid', '$cleanFmc')"; mysqli_query($con, $insertSql); }
推荐版代码(使用预处理语句,彻底避免SQL注入)
直接拼接字符串存在SQL注入风险,更安全的方式是使用mysqli预处理语句:
$studentid = $_POST["id"]; // 删除已有选课的预处理语句 $deleteStmt = mysqli_prepare($con, "DELETE FROM enrollments WHERE student_fk = ?"); mysqli_stmt_bind_param($deleteStmt, "i", $studentid); // "i"表示参数为整数类型 mysqli_stmt_execute($deleteStmt); mysqli_stmt_close($deleteStmt); // 插入新选课的预处理语句 $insertStmt = mysqli_prepare($con, "INSERT INTO enrollments (student_fk, course_fk) VALUES (?, ?)"); mysqli_stmt_bind_param($insertStmt, "ii", $studentid, $fmc); // 两个整数参数 foreach($fmcourse as $fmc) { mysqli_stmt_execute($insertStmt); } mysqli_stmt_close($insertStmt);
额外说明
如果你的需求不是替换全部选课,而是更新特定的选课记录(比如修改某条已有记录的课程),那你需要在UPDATE语句中添加更精准的条件(比如指定eid),但从你的描述来看,替换全部选课的场景更符合你的需求。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

