CodeIgniter中PHPExcel导入单条数据失败,多条正常问题求助
问题分析与解决方案
你的问题出在几个关键逻辑上,导致单条数据插入时触发access denied跳转,具体原因和修复步骤如下:
1. 核心问题:affected_rows判断位置错误
当前代码中,$this->db->affected_rows()的判断在文件上传逻辑之外,这意味着:
- 即使上传了单条数据的文件,但如果插入操作失败(比如数据不符合数据库约束、
$data数组异常),会直接跳转到access denied; - 甚至没有上传文件时,也会触发这个跳转逻辑,完全不符合预期。
2. 次要问题:$data数组未初始化
如果之前的请求残留了空的$data数组,会导致插入空数据,affected_rows为0,触发错误跳转。
3. 潜在问题:Excel行号判断缺失
如果Excel文件中只有表头(第1行),没有数据行,$highestRow会等于1,循环不会执行,$data为空,插入操作无影响,同样触发错误跳转。
修复后的完整代码
if (isset($_FILES['employees_file'])) { $file = $_FILES['employees_file']['tmp_name']; $this->load->library('PHPExcel'); $excel = PHPExcel_IOFactory::load($file); // 初始化$data数组,避免残留数据干扰 $data = []; foreach($excel->getWorksheetIterator() as $worksheet) { $highestRow = $worksheet->getHighestRow(); // 检查是否存在有效数据行(表头在第1行,数据从第2行开始) if ($highestRow < 2) { redirect('employees/index/no_data'); // 跳转到无数据提示页面 return; } for($row=2; $row<=$highestRow; $row++) { $data[] = array( 'first_name' => ($cellValue = $worksheet->getCellByColumnAndRow(0, $row)->getValue()) == "" ? null : $cellValue, 'last_name' => $worksheet->getCellByColumnAndRow(1, $row)->getValue(), 'enroll_id' => $worksheet->getCellByColumnAndRow(2, $row)->getValue(), 'nic' => $worksheet->getCellByColumnAndRow(3, $row)->getValue(), 'job_title_id' => $worksheet->getCellByColumnAndRow(4, $row)->getValue(), 'join_date' => $worksheet->getCellByColumnAndRow(5, $row)->getValue(), 'loc_id' => $worksheet->getCellByColumnAndRow(6, $row)->getValue(), 'supervisor_id' => $worksheet->getCellByColumnAndRow(7, $row)->getValue(), 'dob' => $worksheet->getCellByColumnAndRow(8, $row)->getValue(), 'dept_id' => $worksheet->getCellByColumnAndRow(9, $row)->getValue(), 'email' => $worksheet->getCellByColumnAndRow(10, $row)->getValue(), 'official_email' => $worksheet->getCellByColumnAndRow(11, $row)->getValue(), 'phone' => $worksheet->getCellByColumnAndRow(12, $row)->getValue(), 'address' => $worksheet->getCellByColumnAndRow(13, $row)->getValue(), 'marital_status' => $worksheet->getCellByColumnAndRow(14, $row)->getValue(), 'gender' => $worksheet->getCellByColumnAndRow(15, $row)->getValue(), 'rel_name' => $worksheet->getCellByColumnAndRow(16, $row)->getValue(), 'rel_relation' => $worksheet->getCellByColumnAndRow(17, $row)->getValue(), 'rel_contact' => $worksheet->getCellByColumnAndRow(18, $row)->getValue(), 'employment_status' => $worksheet->getCellByColumnAndRow(19, $row)->getValue(), 'date_of_confirmation'=> $worksheet->getCellByColumnAndRow(20, $row)->getValue(), 'gross_salary' => $worksheet->getCellByColumnAndRow(21, $row)->getValue(), 'dept_role' => $worksheet->getCellByColumnAndRow(22, $row)->getValue(), ); } } $this->SqlModel->insert($data); // 将affected_rows判断移到文件上传逻辑内部,精准控制跳转 if ($this->db->affected_rows() > 0) { redirect('employees/index/success'); } else { // 记录插入错误日志,方便后续排查问题 $dbError = $this->db->error(); log_message('error', 'Excel导入失败:' . print_r($dbError, true)); // 跳转到导入失败提示页面,而非access denied redirect('employees/index/import_failed'); } } else { // 未上传文件时的处理,跳转到对应提示页面 redirect('employees/index/upload_error'); }
额外排查步骤
如果修复后单条数据仍无法插入,按以下步骤排查:
- 检查
SqlModel的insert方法:确认它调用的是CodeIgniter的insert_batch()(批量插入),而非insert()(单条插入)。如果是insert(),传入二维数组会直接导致插入失败; - 验证单条数据的合法性:检查Excel中的单条数据是否符合数据库字段约束(比如非空字段是否为空、日期/数字格式是否正确);
- 查看数据库错误日志:通过
$this->db->error()获取具体错误信息,精准定位插入失败的原因。
内容的提问来源于stack exchange,提问作者Ribal Arshad
相关产品推荐
相关产品推荐

