基于ID实现diklat表数据编辑删除及编辑失败问题排查
编辑功能失败原因排查与修复方案
问题分析
编辑功能失效主要由以下几个关键问题导致:
1. 编辑链接未传递记录ID
视图中的Edit按钮链接未携带目标记录的id_diklat参数,控制器无法识别需要编辑的具体数据。
2. 控制器Edit方法未接收并使用ID参数
- 方法定义未包含ID参数,无法获取前端传递的记录ID
- 查询待编辑数据时,
get_where语句缺少有效条件(仅传递键名['id_diklat']而非键值对),无法正确获取目标记录
3. 编辑表单缺少隐藏ID字段
提交编辑数据的表单未包含id_diklat的隐藏输入项,控制器无法获取要更新的记录ID,最终更新语句无匹配目标。
4. 删除功能存在参数顺序错误
模型的delete_data方法参数顺序与控制器调用时的传递顺序不匹配,导致删除操作也无法正常执行。
修复方案
1. 修改视图中的编辑链接
在列表页面的Edit按钮中添加记录ID参数:
<a href="<?= base_url('diklat/edit/' . $diklat['id_diklat']); ?>" class="btn btn-sm btn-outline-primary">Edit</a>
2. 修正控制器Edit方法
更新方法定义以接收ID参数,并正确查询目标记录:
public function edit($id = null) { // 校验ID是否存在 if (!$id) { redirect('diklat'); } $data['title'] = 'Edit Data Pelatihan & Seminar'; $data['akun'] = $this->db->get_where('akun', ['email' => $this->session->userdata('email')])->row_array(); // 根据ID获取待编辑记录 $data['diklat'] = $this->db->get_where('diklat', ['id_diklat' => $id])->row_array(); // 校验记录是否存在 if (!$data['diklat']) { redirect('diklat'); } $this->form_validation->set_rules('f_namadiklat', 'nama_diklat', 'required|trim', ['required' => 'Nama Diklat Belum Diisi!']); $this->form_validation->set_rules('f_penyelenggara', 'penyelenggara', 'required|trim', ['required' => 'Penyelenggara Diklat Harus Diisi!']); $this->form_validation->set_rules('f_tempatdiklat', 'tempat_diklat', 'required|trim', ['required' => 'Tempat Diklat Harus Diisi!']); if ($this->form_validation->run() == false) { $this->load->view('templates/header', $data); $this->load->view('templates/sidebarmenu', $data); $this->load->view('templates/top_bar', $data); $this->load->view('diklat/edit'); $this->load->view('templates/footer'); } else { $id = $this->input->post('id_diklat'); $nama_diklat = $this->input->post('f_namadiklat'); $jenis_diklat = $this->input->post('f_jenisdiklat'); $penyelenggara = $this->input->post('f_penyelenggara'); $tempat_diklat = $this->input->post('f_tempatdiklat'); $waktu_diklat = $this->input->post('tgl_diklat'); $this->db->set('nama_diklat', $nama_diklat); $this->db->set('jenis_diklat', $jenis_diklat); $this->db->set('penyelenggara', $penyelenggara); $this->db->set('tempat_diklat', $tempat_diklat); $this->db->set('waktu_diklat', $waktu_diklat); // 处理证书上传 $upload_data = $_FILES['sertifikat']['name']; if ($upload_data) { $config['allowed_types'] = 'jpg|jpeg|png|pdf'; $config['max_size'] = '2048'; $config['upload_path'] = './assets/doc/sertifikat/'; $this->load->library('upload', $config); if ($this->upload->do_upload('sertifikat')) { $old_data = $data['diklat']['sertifikat']; if ($old_data != 'default.jpg') { unlink(FCPATH . 'assets/doc/sertifikat/' . $old_data); } $new_sertifikat = $this->upload->data('file_name'); $this->db->set('sertifikat', $new_sertifikat); } else { echo $this->upload->display_errors(); } } $this->db->where('id_diklat', $id); $this->db->update('diklat'); $this->session->set_flashdata('message', '<div class="alert alert-success" role="alert">Data Diklat Berhasil di Update</div>'); redirect('diklat'); } }
3. 在编辑表单中添加隐藏ID字段
在diklat/edit视图的表单内添加以下代码,确保提交时传递记录ID:
<input type="hidden" name="id_diklat" value="<?= $diklat['id_diklat']; ?>">
4. 修复删除功能的参数顺序
方案一:修正模型方法参数顺序
function delete_data($where, $table) { $this->db->where($where); $this->db->delete($table); }
方案二:修正控制器调用顺序
public function delete($id) { $this->load->model('diklat_m'); $where = array('id_diklat' => $id); // 调整参数顺序:先表名,后条件 $this->diklat_m->delete_data('diklat', $where); redirect('diklat'); }
内容的提问来源于stack exchange,提问作者labkes
相关产品推荐
相关产品推荐

