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

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');
}

额外排查步骤

如果修复后单条数据仍无法插入,按以下步骤排查:

  1. 检查SqlModel的insert方法:确认它调用的是CodeIgniter的insert_batch()(批量插入),而非insert()(单条插入)。如果是insert(),传入二维数组会直接导致插入失败;
  2. 验证单条数据的合法性:检查Excel中的单条数据是否符合数据库字段约束(比如非空字段是否为空、日期/数字格式是否正确);
  3. 查看数据库错误日志:通过$this->db->error()获取具体错误信息,精准定位插入失败的原因。

内容的提问来源于stack exchange,提问作者Ribal Arshad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55