CodeIgniter3洗衣系统数据无法插入数据库问题修复
CodeIgniter3洗衣订单无法插入数据库的问题排查与修复
问题描述
基于CodeIgniter3开发洗衣管理系统,用户端提交洗衣订单时出现数据无法插入数据库的异常。已确认数据库名称、表名、字段名均正确,添加错误处理逻辑后仍无报错信息输出。
原视图代码
<!-- Begin Page Content --> <!-- Page Heading --> <div class="row"> <!-- Page Heading --> <div class="col-sm-1"> <a href="<?= base_url('home/index'); ?>" class="btn btn-outline-primary"><i class="fas fa-arrow-left"></i></a> </div> <div class="col-sm-5"> <h1 class="h3 mb-4 text-gray-800"><?= $title; ?></h1> </div> </div> <div class="container"> <form name="frm_add" action="<?= base_url('home/tambahOrderCk'); ?>" method="post"> <div class="row"> <div class="col"> <div class="form-group"> <label for="exampleFormControlInput1">Nama</label> <input type="text" class="form-control" id="name" name="name" placeholder="Masukan Nama" value="<?= $user['name'] ?>"> <?= form_error('name', '<small class="text-danger pl-3">', '</small>'); ?> </div> <div class="form-group"> <label for="exampleFormControlInput1">No Handphone Aktif</label> <input type="number" class="form-control" id="no_hp" name="no_hp" placeholder="Masukan Nomor" value="<?= $user['phone_number'] ?>"> <?= form_error('no_hp', '<small class="text-danger pl-3">', '</small>'); ?> </div> <div class="form-group"> <label for="exampleFormControlSelect1">Jenis Paket</label> <select class="form-control" id="jenis_paket" name="jenis_paket"> <?php foreach ($jenis_paket as $jp) : ?> <option value="<?= $jp['id_ck'] ?>"><?= $jp['nama_paket_ck'] ?></option> <?php endforeach; ?> </select> </div> <div class="form-group"> <label for="keterangan">Catatan</label> <textarea class="form-control" id="keterangan" name="keterangan" rows="3"></textarea> </div> </div> <div class="col"> <div class="form-group"> <label for="address">Alamat</label> <textarea class="form-control" rows="2" id="address" name="address"><?= $user['address'] ?></textarea> <?= form_error('address', '<small class="text-danger pl-3">', '</small>'); ?> </div> <div class="form-group"> <label for="berat_cucian">Berat Cucian (/Kg)</label> <input type="number" class="form-control" id="berat_cucian" name="berat_cucian" placeholder="Masukan Berat Cucian"> <?= form_error('berat_cucian', '<small class="text-danger pl-3">', '</small>'); ?> </div> </div> <button type="submit" class="btn btn-primary"> Pesan Sekarang </button> </form> </div>
原控制器代码
public function tambahOrderCk() { $this->load->library('form_validation'); $data['title'] = 'Tambah Order Cuci Komplit'; $data['user'] = $this->db->get_where('user', ['email' => $this->session->userdata('email')])->row_array(); $data['jenis_paket'] = $this->db->get('tbl_cuci_komplit')->result_array(); $this->form_validation->set_rules('name', 'Name', 'required', [ 'required' => 'Name harus diisi!' ]); $this->form_validation->set_rules('no_telp', 'No Telp', 'required', [ 'required' => 'No Telp harus diisi!' ]); $this->form_validation->set_rules('address', 'Address', 'required', [ 'required' => 'Alamat harus diisi!' ]); $this->form_validation->set_rules('berat_cucian', 'Berat Cucian', 'required', [ 'required' => 'Berat Cucian harus diisi!' ]); $or_ck_number = 'CK/' . date('Ymd') . '/' . rand(100000, 999999); $nama_order = htmlspecialchars($this->input->post('name', true)); $alamat = htmlspecialchars($this->input->post('address'), true); $jenis_paket = htmlspecialchars($this->input->post('jenis_paket'), true); $berat = htmlspecialchars($this->input->post('berat_cucian'), true); $waktuKerja = 0; $tarif_ck = 0; if ($jenis_paket == 1 or $jenis_paket == 2 or $jenis_paket == 3) { $waktu_Kerja = $this->db->get_where('tbl_cuci_komplit', ['id_ck' => $jenis_paket])->row_array(); $waktuKerja = (string)$waktu_Kerja['waktu_kerja_ck']; $tarifCk = $this->db->get_where('tbl_cuci_komplit', ['id_ck' => $jenis_paket])->row_array(); $tarif_ck = $tarifCk['tarif_ck']; } if ($this->form_validation->run() == true) { $data = [ 'or_ck_number' => $or_ck_number, 'nama_order_ck' => $nama_order, 'no_telp_ck' => htmlspecialchars($this->input->post('no_telp'), true), 'alamat_ck' => $alamat, 'jenis_paket_ck' => $jenis_paket, 'waktu_kerja_ck' => $waktuKerja, 'berat_qty_ck' => $berat, 'harga_perkilo' => $tarif_ck, 'tgl_masuk_ck' => date('Y-m-d'), 'tgl_keluar_ck' => date('Y-m-d', strtotime('+' . $waktuKerja . 'days')), 'total_bayar_ck' => $tarif_ck * htmlspecialchars($this->input->post('berat_cucian'), true), 'keterangan_ck' => htmlspecialchars($this->input->post('keterangan'), true) ]; $this->db->insert('tbl_order_ck', $data); try { if ($this->db->affected_rows() > 0) { echo "Data berhasil dimasukkan ke dalam database"; } else { echo "Error: " . $this->db->error(); } } catch (Exception $e) { echo "Error: " . $e->getMessage(); } redirect('home/tambahOrderCk'); } else { $this->load->view('templates/header', $data); $this->load->view('templates/sidebar', $data); $this->load->view('templates/topbar', $data); $this->load->view('home/tambahOrderCk', $data); $this->load->view('templates/footer'); } }
问题分析
- 字段名称不匹配:视图中手机号字段的
name属性为no_hp,但控制器的表单验证和数据插入时使用no_telp,导致表单验证不通过或插入数据缺失,这是数据无法插入的核心原因。 - 错误提示被重定向覆盖:插入操作后立即执行
redirect,即使有错误输出也会被页面跳转覆盖,无法看到实际报错信息。 - 冗余数据库查询:重复查询套餐的工时和价格信息,造成不必要的数据库请求开销。
修复方案
- 统一字段名称:将控制器中验证和获取手机号的字段名改为
no_hp,与视图保持一致。 - 调整重定向逻辑:使用CodeIgniter的
flashdata显示成功提示;插入失败时直接加载视图并传递错误信息,避免跳转覆盖报错。 - 优化数据库查询:单次查询套餐信息,同时获取工时和价格数据,减少数据库请求次数。
修复后的控制器代码
public function tambahOrderCk() { $this->load->library('form_validation'); $data['title'] = 'Tambah Order Cuci Komplit'; $data['user'] = $this->db->get_where('user', ['email' => $this->session->userdata('email')])->row_array(); $data['jenis_paket'] = $this->db->get('tbl_cuci_komplit')->result_array(); // 修正表单验证规则的字段名,与视图一致 $this->form_validation->set_rules('name', 'Name', 'required', [ 'required' => 'Name harus diisi!' ]); $this->form_validation->set_rules('no_hp', 'No Telp', 'required', [ 'required' => 'No Telp harus diisi!' ]); $this->form_validation->set_rules('address', 'Address', 'required', [ 'required' => 'Alamat harus diisi!' ]); $this->form_validation->set_rules('berat_cucian', 'Berat Cucian', 'required', [ 'required' => 'Berat Cucian harus diisi!' ]); $or_ck_number = 'CK/' . date('Ymd') . '/' . rand(100000, 999999); $nama_order = htmlspecialchars($this->input->post('name', true)); $alamat = htmlspecialchars($this->input->post('address'), true); $jenis_paket = htmlspecialchars($this->input->post('jenis_paket'), true); $berat = htmlspecialchars($this->input->post('berat_cucian'), true); // 修正获取手机号的字段名 $no_hp = htmlspecialchars($this->input->post('no_hp'), true); $waktuKerja = 0; $tarif_ck = 0; // 优化为单次查询套餐信息 if (in_array($jenis_paket, ['1','2','3'])) { $paket_info = $this->db->get_where('tbl_cuci_komplit', ['id_ck' => $jenis_paket])->row_array(); if($paket_info){ $waktuKerja = (string)$paket_info['waktu_kerja_ck']; $tarif_ck = $paket_info['tarif_ck']; } } if ($this->form_validation->run() == true) { $insert_data = [ 'or_ck_number' => $or_ck_number, 'nama_order_ck' => $nama_order, 'no_telp_ck' => $no_hp, 'alamat_ck' => $alamat, 'jenis_paket_ck' => $jenis_paket, 'waktu_kerja_ck' => $waktuKerja, 'berat_qty_ck' => $berat, 'harga_perkilo' => $tarif_ck, 'tgl_masuk_ck' => date('Y-m-d'), 'tgl_keluar_ck' => date('Y-m-d', strtotime('+' . $waktuKerja . 'days')), 'total_bayar_ck' => $tarif_ck * $berat, 'keterangan_ck' => htmlspecialchars($this->input->post('keterangan'), true) ]; $this->db->insert('tbl_order_ck', $insert_data); if ($this->db->affected_rows() > 0) { // 添加成功提示,使用session flashdata $this->session->set_flashdata('message', '<div class="alert alert-success">订单提交成功!</div>'); redirect('home/tambahOrderCk'); } else { // 捕获错误信息并传递到视图 $data['error_msg'] = '插入失败:' . json_encode($this->db->error()); $this->load->view('templates/header', $data); $this->load->view('templates/sidebar', $data); $this->load->view('templates/topbar', $data); $this->load->view('home/tambahOrderCk', $data); $this->load->view('templates/footer'); return; } } else { $this->load->view('templates/header', $data); $this->load->view('templates/sidebar', $data); $this->load->view('templates/topbar', $data); $this->load->view('home/tambahOrderCk', $data); $this->load->view('templates/footer'); } }
内容的提问来源于stack exchange,提问作者AtepRiandi Pahmi
相关产品推荐
相关产品推荐

