CodeIgniter 3无法插入数据库数据,提交仅刷新页面
问题描述
我正在学习使用Google Maps API及CodeIgniter Google Maps V3 API Library开发CRUD GIS网页项目,但卡在数据插入数据库环节。表单提交按钮无法将数据存入数据库,点击后仅刷新页面,无任何错误提示,数据未成功插入。
相关代码
自动加载配置文件(autoload.php)
已加载所需库与助手:
$autoload['libraries'] = array('session', 'database', 'form_validation', 'upload'); $autoload['helper'] = array('url', 'form', 'file');
控制器(Dbmaps.php)
<?php defined('BASEPATH') or exit('No direct script access allowed'); class Dbmaps extends CI_Controller { public function __construct() { parent::__construct(); // 加载依赖 $this->load->library('googlemaps'); $this->load->model('m_dbmaps'); } // 获取所有数据 public function index() { $data = array( 'title' => 'Database Maps — Sales Tracking', 'section' => 'Database Maps', 'map' => $this->googlemaps->create_map(), 'dbmaps' => $this->m_dbmaps->lists(), 'isi' => 'dbmaps/v_lists' ); $this->load->view('template/v_wrapper', $data, FALSE); } // 添加新数据 public function input() { // ------------------ Google Maps 配置 ------------------ $config = array( 'center' => '-6.981782663363796, 110.40922272688273', 'zoom' => '15', 'map_height' => '600px' ); $this->googlemaps->initialize($config); // 设置标记点 $marker = array( 'position' => '-6.981782663363796, 110.40922272688273', 'draggable' => true, 'ondragend' => 'setToForm(event.latLng.lat(), event.latLng.lng());' ); $this->googlemaps->add_marker($marker); // ------------------ Google Maps 配置结束 ------------------ // ------------------ 表单验证 ------------------ $this->form_validation->set_rules('nama_maps', 'Nama Maps', 'required'); $this->form_validation->set_rules('no_telpon', 'Nomor Telpon', 'required'); $this->form_validation->set_rules('alamat', 'Alamat', 'required'); $this->form_validation->set_rules('latitude', 'Latitude', 'required'); $this->form_validation->set_rules('longitude', 'Longitude', 'required'); $this->form_validation->set_rules('deskripsi', 'Deskripsi', 'required'); // 表单验证失败 if ($this->form_validation->run() == FALSE) { $data = array( 'title' => 'Input Database Maps — Sales Tracking', 'section' => 'Input Database Maps', 'map' => $this->googlemaps->create_map(), 'isi' => 'dbmaps/v_add' ); $this->load->view('template/v_wrapper', $data, FALSE); } // 表单验证成功 else { $data = array( 'nama_maps' => $this->input->post('nama_maps'), 'no_telpon' => $this->input->post('no_telpon'), 'alamat' => $this->input->post('alamat'), 'latitude' => $this->input->post('latitude'), 'longitude' => $this->input->post('longitude'), 'deskripsi' => $this->input->post('deskripsi') ); $this->m_dbmaps->input($data); $this->session->set_flashdata('pesan', 'Data berhasil ditambahkan!'); redirect('dbmaps'); } // ------------------ 表单验证结束 ------------------ } } /* End of file Dbmaps.php */
模型(M_dbmaps.php)
<?php defined('BASEPATH') or exit('No direct script access allowed'); class M_dbmaps extends CI_Model { // 获取数据 public function lists() { $this->db->select('*'); $this->db->from('tbl_dbmaps'); $this->db->order_by('id_maps', 'desc'); return $this->db->get()->result(); } // 插入数据 public function input($data) { $this->db->insert('tbl_dbmaps', $data); } }
视图(v_add)表单部分
<!-- Form Input --> <?= form_open('dbmaps/input'); ?> <div class="form-group"> <label>Nama Maps</label> <div class="input-group"> <div class="input-group-prepend"> <div class="input-group-text"> <i class="fas fa-file-signature"></i> </div> </div> <input type="text" class="form-control" name="nama_maps" placeholder="Nama Maps" required> </div> </div> <div class="form-group"> <label>Nomor Telpon</label> <div class="input-group"> <div class="input-group-prepend"> <div class="input-group-text"> <i class="fas fa-phone"></i> </div> </div> <input type="text" class="form-control phone-number" name="no_telpon" placeholder="Nomor Telpon" required> </div> </div> <div class="form-group"> <label>Alamat</label> <div class="input-group"> <div class="input-group-prepend"> <div class="input-group-text"> <i class="fas fa-address-card"></i> </div> </div> <input type="text" class="form-control" name="alamat" placeholder="Alamat Maps" required> </div> </div> <div class="form-group"> <label>Latitude</label> <div class="input-group"> <div class="input-group-prepend"> <div class="input-group-text"> <i class="fas fa-map-marker-alt"></i> </div> </div> <input type="text" class="form-control" name="latitude" placeholder="Latitude Maps" required disabled> </div> </div> <div class="form-group"> <label>Longitude</label> <div class="input-group"> <div class="input-group-prepend"> <div class="input-group-text"> <i class="fas fa-map-marker-alt"></i> </div> </div> <input type="text" class="form-control" name="longitude" placeholder="Longitude Maps" required disabled> </div> </div> <div class="form-group"> <label>Deskripsi</label> <textarea type="text" class="form-control" name="deskripsi" style="height: 100px;" placeholder="..." required></textarea> </div> <div class="form-group"> <button class="btn btn-primary" type="submit">Save</button> <button class="btn btn-danger" type="reset">Cancel</button> </div> <?= form_close(); ?>
解决思路
1. 禁用输入框的提交问题
视图中latitude和longitude输入框设置了disabled属性,浏览器不会提交禁用状态的输入框值,导致控制器接收不到这两个字段,触发表单验证失败,最终页面刷新但未插入数据。
解决方法:
- 将
disabled改为readonly,这样输入框无法编辑但值会被表单提交:
<input type="text" class="form-control" name="latitude" placeholder="Latitude Maps" required readonly> <input type="text" class="form-control" name="longitude" placeholder="Longitude Maps" required readonly>
- 或者保留
disabled,同时添加对应的隐藏输入框,在setToForm函数中同步值:
<!-- 原禁用输入框 --> <input type="text" class="form-control" name="latitude_display" placeholder="Latitude Maps" required disabled> <!-- 新增隐藏输入框 --> <input type="hidden" name="latitude" id="latitude"> <!-- Longitude同理 --> <input type="text" class="form-control" name="longitude_display" placeholder="Longitude Maps" required disabled> <input type="hidden" name="longitude" id="longitude">
然后修改setToForm函数:
function setToForm(lat, lng) { document.getElementById('latitude').value = lat; document.getElementById('latitude_display').value = lat; document.getElementById('longitude').value = lng; document.getElementById('longitude_display').value = lng; }
2. 添加表单验证错误提示
当前视图未显示表单验证的错误信息,导致验证失败时用户无法得知原因。可以在每个输入框下方添加错误提示:
<div class="form-group"> <label>Nama Maps</label> <div class="input-group"> <!-- 原输入框内容 --> </div> <?= form_error('nama_maps', '<small class="text-danger">', '</small>'); ?> </div>
或者在表单顶部添加全局错误提示:
<?= validation_errors('<div class="alert alert-danger">', '</div>'); ?>
3. 调试建议
- 在控制器
input方法的else分支前,打印POST数据确认是否接收完整:
var_dump($this->input->post()); die();
- 开启CodeIgniter的日志功能,在
config.php中设置:
$config['log_threshold'] = 2;
查看application/logs下的日志文件,排查数据库插入是否有错误。
内容的提问来源于stack exchange,提问作者Moch Syafrizal Azhar
相关产品推荐
相关产品推荐

