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

CodeIgniter表单图片上传后文件名未写入数据库问题排查

问题排查与修复方案

你遇到的核心问题集中在控制器的upro方法里,我帮你拆解并修复:

1. 关键错误点分析

  • $data变量被完全覆盖:你在循环处理完图片上传、准备把文件名存入$data后,紧接着执行了$data= $this->input->post();,这行代码会直接清空之前存储的图片文件名信息,导致图片字段根本不会被传到数据库。
  • 图片字段名赋值错误:循环里的$data[$field_values] = $image_path;逻辑错误,$field_values是整个文件信息的数组(包含name、tmp_name等属性),你需要用表单里的上传字段名(比如pro_image1)作为$data的键,应该写成$data[$field_name] = $image_path;。

修复后的控制器代码

public function upro() {
    $this->form_validation->set_rules('pro_name','Product','required');
    $this->form_validation->set_rules('pro_cat','Categroy','required');
    $this->form_validation->set_rules('pro_pa_cat','Parent','required');
    $this->form_validation->set_rules('pro_desc','Description','required');
    $this->form_validation->set_rules('pro_color','Color','required');
    $this->form_validation->set_rules('pro_cost','Cost','required');
    $this->form_validation->set_rules('pro_brand','Brand','required');
    
    $expected_files = array('pro_image1', 'pro_image2', 'pro_image3', 'pro_image4');
    $i = 1;
    foreach ($expected_files as $field_name) {
        if (empty($_FILES[$field_name]['name'])) {
            $this->form_validation->set_rules($field_name, 'Image' . $i, 'required');
        }
        $i++;
    }

    if ($this->form_validation->run()) {
        $config = [
            'upload_path' => './uploads',
            'allowed_types' => 'jpg|gif|png|jpeg',
        ];
        $this->load->library('upload', $config);
        
        // 先获取POST数据,再追加图片信息,避免覆盖
        $data= $this->input->post();
        $today = date('Y-m-d');
        $data['pro_date'] = $today;

        foreach ($_FILES as $field_name => $field_values) {
            if (!in_array($field_name, $expected_files)) {
                continue; // 跳过非预期的上传字段
            }
            // 新增上传成功判断,避免上传失败时存入错误数据
            if($this->upload->do_upload($field_name)){
                $info = $this->upload->data();
                $image_path = $info['raw_name'] . $info['file_ext'];
                // 用表单字段名作为键存入$data
                $data[$field_name] = $image_path;
            } else {
                // 上传失败时返回错误提示
                $this->session->set_flashdata('msg', $this->upload->display_errors());
                return redirect('admin/apro');
            }
        }

        // 调试时可以开启下面两行,确认$data包含所有字段
        // echo "<pre>";
        // print_r($data);
        $this->adata->uproQ($data);
        $this->session->set_flashdata('smsg', 'Product upload success!');
        return redirect('admin/products');
    } else {
        $this->session->set_flashdata('msg', validation_errors());
        return redirect('admin/apro');
    }
}

额外优化建议

  • 保留调试用的print_r($data):可以临时开启,确认$data数组里包含pro_image1到pro_image4的字段和正确的文件名,确保数据格式正确。
  • 上传错误处理:新增的if($this->upload->do_upload($field_name))判断可以避免上传失败(比如文件格式不符合、文件过大)时,存入空值或错误的文件名到数据库。

内容的提问来源于stack exchange,提问作者sachin singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:13