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

CodeIgniter同时上传特色图与多图报错求助

解决多文件上传时数组转字符串及数据库插入错误的问题

问题根源

你遇到的核心问题很明确:在Controller的foreach循环里,你错误地把整个$_FILES['userfile']['name']数组直接赋值给了$slider,而不是逐个收集上传成功的文件名到数组中。当这个完整数组被传给Model后,Model尝试直接将数组插入数据库的slide字段(该字段是字符串类型),自然就触发了Array to string conversion的Notice,同时数据库因为无法识别Array作为合法字段值,抛出了Unknown column 'Array'的错误。

另外你的多文件上传逻辑也有疏漏:CodeIgniter的do_upload()方法需要传入的是表单字段名,而不是文件名,直接传$name是无法正确触发上传的。

修正步骤

1. 重构Controller中的多文件上传逻辑

我们需要重新处理多文件上传流程,把每个成功上传的文件名收集到数组里,再传给Model做批量插入。

修改后的Controller代码:

public function create_yacht(){
    $data['title'] = 'Create';
    $data['categories'] = $this->category_model->get_categories();
    
    $this->form_validation->set_rules('title', 'Title', 'required');
    $this->form_validation->set_rules('city', 'City', 'required');
    
    if($this->form_validation->run() === FALSE){
        $this->load->view('templates/admin_header');
        $this->load->view('admin/create_yacht', $data);
        $this->load->view('templates/admin_footer');
    }else{
        $config['upload_path'] = './assets/images';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['max_size'] = '2048';
        $this->load->library('upload', $config);
        
        // 处理特色图片上传
        $featured = 'featured';
        if (!$this->upload->do_upload($featured)) {
            $errors = array('errors' => $this->upload->display_errors());
            $yacht_img = 'https://via.placeholder.com/1920x1080';
        }else{
            $upload_data = $this->upload->data();
            $yacht_img = $upload_data['file_name']; // 用upload返回的文件名更可靠,避免重命名问题
        }
        
        // 处理多轮播图上传
        $slider_files = array();
        if(!empty($_FILES['userfile']['name'])){
            // 重新初始化上传配置(避免特色图片上传修改了配置)
            $this->upload->initialize($config);
            
            foreach ($_FILES['userfile']['name'] as $key => $name) {
                // 构造单文件的$_FILES数组,适配CI的upload类
                $_FILES['single_file']['name'] = $_FILES['userfile']['name'][$key];
                $_FILES['single_file']['type'] = $_FILES['userfile']['type'][$key];
                $_FILES['single_file']['tmp_name'] = $_FILES['userfile']['tmp_name'][$key];
                $_FILES['single_file']['error'] = $_FILES['userfile']['error'][$key];
                $_FILES['single_file']['size'] = $_FILES['userfile']['size'][$key];
                
                if ($this->upload->do_upload('single_file')) {
                    $upload_data = $this->upload->data();
                    $slider_files[] = $upload_data['file_name']; // 收集成功上传的文件名
                } else {
                    // 这里可以根据需求处理上传失败的文件,比如跳过或记录错误日志
                    continue;
                }
            }
        }
        
        // 传递处理好的数据到Model
        $this->yacht_model->create_yacht($yacht_img, $slider_files);
        redirect('admin');
    }
}

2. 调整Model中的插入逻辑

因为轮播图是多条独立数据,需要循环插入每条记录,而不是把整个数组一次性插入到单一行中。

修改后的Model代码:

public function create_yacht($yacht_img, $slider_files){
    $slug = url_title($this->input->post('title'));
    $data = array(
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'img' => $yacht_img,
        'city' => $this->input->post('city'),
        'category' => $this->input->post('category'),
        'price' => $this->input->post('price'),
        'description' => $this->input->post('description')
    );
    $this->db->insert('yachts', $data);
    $insert_id = $this->db->insert_id();
    
    // 循环插入每条轮播图记录
    if(!empty($slider_files)){
        foreach($slider_files as $slide){
            $data_4 = array(
                'yacht_slide_id' => $insert_id,
                'slide' => $slide
            );
            $this->db->insert('yacht_slider', $data_4);
        }
    }
}

关键注意点

  • CodeIgniter的upload类默认只处理单文件,所以多文件上传时需要手动构造单文件的$_FILES数组来适配。
  • 使用$this->upload->data()['file_name']获取文件名比直接取$_FILES里的原始文件名更可靠,因为当文件名重复时,CI会自动重命名文件,upload_data里的是最终存储在服务器上的文件名。
  • 必须循环插入轮播图数据,确保每张图片对应yacht_slider表中的一行记录,彻底避免数组转字符串的错误。

内容的提问来源于stack exchange,提问作者Ahmad Tahhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:43:18