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
相关产品推荐
相关产品推荐

