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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:35