MySQL数据重复插入问题:PHP导入时pendaftaran表数据重复
问题原因与解决方案
嘿,你的pendaftaran表数据重复插入的问题其实一眼就能看出来——你在代码里重复执行了两次插入语句!
具体问题点
看你代码里的这段核心逻辑:
mysqli_query($conn, $query1); var_dump(mysqli_query($conn, $query1)); mysqli_query($conn, $query2); var_dump(mysqli_query($conn, $query2));
每一条插入操作都被执行了两次:
- 第一次调用
mysqli_query($conn, $query1)已经完成了数据插入 - 第二次在
var_dump()里再次调用mysqli_query($conn, $query1),等于又执行了一遍插入操作
至于murid表看起来正常,大概率是因为No_Sekolah_Murid字段设置了主键/唯一约束,第二次插入会因为重复键报错失败;而pendaftaran表没有这类约束,两次插入都成功,就出现了重复数据。
修复方案
把重复的执行逻辑去掉,先把SQL执行结果保存到变量,再对变量做调试输出:
// 执行murid插入并保存结果 $result1 = mysqli_query($conn, $query1); var_dump($result1); // 仅输出执行结果,不会再次插入 // 执行pendaftaran插入并保存结果 $result2 = mysqli_query($conn, $query2); var_dump($result2);
额外优化建议
除了修复重复插入的问题,还有几个细节可以改进:
- 防止SQL注入:当前代码直接把CSV数据和会话变量拼接到SQL里,存在严重的注入风险。建议使用mysqli预处理语句,示例如下:
// murid表的预处理插入示例 $stmt = mysqli_prepare($conn, "INSERT INTO murid(No_Sekolah_Murid, Nama_Murid, Kelas, Tarikh_Daftar) VALUES(?, ?, ?, NOW())"); mysqli_stmt_bind_param($stmt, "sss", $data[0], $data[1], $data[2]); mysqli_stmt_execute($stmt); - 修正空值判断逻辑:你当前的
empty($data[0] || $data[1] || $data[2] || $data[3])逻辑错误,应该逐个判断字段是否为空:if (empty($data[0]) || empty($data[1]) || empty($data[2]) || empty($data[3])) { echo "<script> window.alert('Sila isikan semua medan dalam fail!'); window.location = ''; </script>"; exit(); } - 优化CSV读取循环:
while (!feof($fail))结合fgetcsv可能导致最后一行重复读取,建议改成更可靠的写法:while (($data = fgetcsv($fail, 0)) !== FALSE) { // 处理每一行数据的逻辑 }
内容的提问来源于stack exchange,提问作者Chuah Hao Min
相关产品推荐
相关产品推荐

