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

