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

