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

CodeIgniter插入数据库前如何校验重复条目 解决Excel导入重复问题

CodeIgniter Excel导入重复数据校验实现方案

实现思路

首先要明确重复数据的判定规则,通常可以用email作为唯一判定字段(也可根据业务需求换成username+contact_no等组合字段),分两层做防重:

  • 数据库层:给判定为唯一的字段(比如email)加唯一索引,作为最后一道防线,避免代码逻辑遗漏导致重复入库,参考SQL:ALTER TABLE excel_files ADD UNIQUE KEY unique_email (email);
  • 代码层:插入前先批量查询已存在的记录,过滤掉重复数据后再做批量插入,减少不必要的数据库操作

修改后的完整代码

public function import_excel(){
    if (!$_FILES["file"]["name"]) {
        echo "Please upload excel file !";
        return;
    }
    $path = $_FILES["file"]["tmp_name"];
    $object = PHPExcel_IOFactory::load($path);
    $data = [];
    foreach ($object->getWorksheetIterator() as $worksheet) {
        $highestRow = $worksheet->getHighestRow();
        $highestColumn = $worksheet->getHighestColumn();
        // 从第二行开始读,跳过表头
        for ($row = 2; $row <= $highestRow; $row++) {
            $username = $worksheet->getCellByColumnAndRow(1, $row)->getValue();
            $email = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
            $address = $worksheet->getCellByColumnAndRow(3, $row)->getValue();
            $contact_no = $worksheet->getCellByColumnAndRow(4, $row)->getValue();
            $data[] = [
                'username' => $username,
                'email' => $email,
                'address' => $address,
                'contact_no' => $contact_no,
            ];
        }
    }

    // 新增去重校验逻辑
    if (!empty($data)) {
        // 1. 提取所有待插入的唯一标识(组合字段可自行调整提取规则)
        $emails = array_column($data, 'email');
        // 2. 查询数据库中已存在的记录
        $exists = $this->db->select('email')
            ->where_in('email', $emails)
            ->get('excel_files')
            ->result_array();
        $existsEmails = array_column($exists, 'email');
        // 3. 过滤掉重复数据,只保留新增条目
        $newData = array_filter($data, function($item) use ($existsEmails) {
            return !in_array($item['email'], $existsEmails);
        });
        // 重置数组索引,避免insert_batch执行异常
        $newData = array_values($newData);
        // 4. 存在新数据才执行批量插入
        if (!empty($newData)) {
            $this->db->insert_batch('excel_files', $newData);
        }
    }
}

自定义说明

如果需要用组合字段判定重复(比如相同用户名+手机号才算重复),只需调整以上代码的提取和比对逻辑:

  • 提取待插入数据时,拼接username和contact_no作为唯一键
  • 查询数据库时也对应拼接两个字段作为查询条件即可

内容的提问来源于stack exchange,提问作者Makuri David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:57:02