CodeIgniter 3含空格数据库及字段无法插入数据问题排查
问题:向含空格的MySQL表/字段插入数据时触发1064语法错误
我按公司规定,向名称包含空格的数据库表及字段插入数据,出现如下错误:
错误代码:1064 您的SQL语法有误;请查阅对应MySQL服务器版本的手册,查看在‘
harian_copy1(RecID,id_peminjaman,Tanggal,Cabang,JenisProyek,’附近使用的正确语法。
控制器代码
public function inputalokasiharian() { // Ambil data dari form atau sumber lainnya $RecID = $this->input->post('RecID'); $id_peminjaman = $this->input->post('id_peminjaman'); $Tanggal = $this->input->post('Tanggal'); $Cabang = $this->input->post('Cabang'); $Jenis_Proyek = $this->input->post('Jenis Proyek'); $Nama_Proyek = $this->input->post('Nama Proyek'); $Kode_Proyek = $this->input->post('Kode Proyek'); $Jenis_Alokasi = $this->input->post('Jenis Alokasi'); $Nama_Alokasi = $this->input->post('Nama Alokasi'); $Jenis_Pekerjaan = $this->input->post('Jenis Pekerjaan'); $keterangan = $this->input->post('keterangan'); $persentase_hasil = $this->input->post('persentase_hasil'); $jam_mulai = $this->input->post('jam_mulai'); $jam_selesai = $this->input->post('jam_selesai'); $ketercapaian = $this->input->post('ketercapaian'); $bagian = $this->input->post('bagian'); $data = array( 'RecID' => $RecID, 'id_peminjaman' => $id_peminjaman, 'Tanggal' => $Tanggal, 'Cabang' => $Cabang, 'Jenis Proyek' => $Jenis_Proyek, 'Nama Proyek' => $Nama_Proyek, 'Kode Proyek' => $Kode_Proyek, 'Jenis Alokasi' => $Jenis_Alokasi, 'Nama Alokasi' => $Nama_Alokasi, 'Jenis Pekerjaan' => $Jenis_Pekerjaan, 'keterangan' => $keterangan, 'persentase_hasil' => $persentase_hasil, 'jam_mulai' => $jam_mulai, 'jam_selesai' => $jam_selesai, 'ketercapaian' => $ketercapaian, 'bagian' => $bagian ); $this->region_model->insertalokasiharian($data); $this->session->set_flashdata('message_input_ah','<div class="alert alert-success alert-dismissible mt-1 fade show" role="alert">Data alokasi harian berhasil dimasukkan <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div>'); redirect($_SERVER['HTTP_REFERER']); }
模型代码
public function insertalokasiharian($data) { $DB2 = $this->load->database('old_db', TRUE); return $DB2->insert('`ga - alokasi harian_copy1`', $data); }
解决方案
错误核心:MySQL要求**包含空格、特殊字符的表名/字段名必须用反引号()包裹**,但CodeIgniter的insert()方法默认不会给字段名自动添加反引号,导致Jenis Proyek`这类带空格的字段被拆成两个独立标识符,触发语法错误。
方法1:给数据数组的字段名手动加反引号
直接修改控制器中的$data数组,给所有带空格的字段名包裹反引号:
$data = array( 'RecID' => $RecID, 'id_peminjaman' => $id_peminjaman, 'Tanggal' => $Tanggal, 'Cabang' => $Cabang, '`Jenis Proyek`' => $Jenis_Proyek, '`Nama Proyek`' => $Nama_Proyek, '`Kode Proyek`' => $Kode_Proyek, '`Jenis Alokasi`' => $Jenis_Alokasi, '`Nama Alokasi`' => $Nama_Alokasi, '`Jenis Pekerjaan`' => $Jenis_Pekerjaan, 'keterangan' => $keterangan, 'persentase_hasil' => $persentase_hasil, 'jam_mulai' => $jam_mulai, 'jam_selesai' => $jam_selesai, 'ketercapaian' => $ketercapaian, 'bagian' => $bagian );
模型代码无需修改,表名已经正确用反引号包裹。
方法2:手动构造带参数绑定的INSERT语句
如果不想修改控制器,可在模型中手动编写SQL,确保所有标识符都带反引号,同时用参数绑定避免注入:
public function insertalokasiharian($data) { $DB2 = $this->load->database('old_db', TRUE); $sql = "INSERT INTO `ga - alokasi harian_copy1` (`RecID`, `id_peminjaman`, `Tanggal`, `Cabang`, `Jenis Proyek`, `Nama Proyek`, `Kode Proyek`, `Jenis Alokasi`, `Nama Alokasi`, `Jenis Pekerjaan`, `keterangan`, `persentase_hasil`, `jam_mulai`, `jam_selesai`, `ketercapaian`, `bagian`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; $params = array( $data['RecID'], $data['id_peminjaman'], $data['Tanggal'], $data['Cabang'], $data['Jenis Proyek'], $data['Nama Proyek'], $data['Kode Proyek'], $data['Jenis Alokasi'], $data['Nama Alokasi'], $data['Jenis Pekerjaan'], $data['keterangan'], $data['persentase_hasil'], $data['jam_mulai'], $data['jam_selesai'], $data['ketercapaian'], $data['bagian'] ); return $DB2->query($sql, $params); }
内容的提问来源于stack exchange,提问作者IMAM IHSANI
相关产品推荐
相关产品推荐

