You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 &mdash; 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 &mdash; 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:17:01