CodeIgniter 4 整数数据无法插入数据库问题求助
问题:表单number字段存入数据库始终为0
视图中构建提交表单,no_lemari和no_rak为number类型,控制器可正常获取所有表单数据,数据通过必填、唯一性验证后调用模型保存,但这两个字段始终存入0(输入值非0)。尝试过intval转换类型、先赋值给变量再保存,均无效。
视图表单代码
<form action="/arsip/save" method="post"> <?= csrf_field(); ?> <div class="mb-3"> <label for="nama_pemegang_hak" class="form-label">Nama Pemegang Hak</label> <input type="text" name="nama_pemegang_hak" class="form-control <?= $validation->hasError('nama_pemegang_hak') ? 'is-invalid' : ''; ?>" id=" nama_pemegang_hak" value="<?= old('nama_pemegang_hak'); ?>"> </div> <div class="mb-3"> <label class="form-label" for="nama_hak">Nama Hak</label> <select class="form-select" id="nama_hak" name="nama_hak"> <option value="Hak Milik">Hak Milik</option> <option value="Hak Guna Bangunan">Hak Guna Bangunan</option> <option value="Warkah">Warkah</option> </select> </div> <div class="mb-3"> <label for="nomor_hak" class="form-label">Nomor Hak</label> <input type="text" name="nomor_hak" class="form-control <?= $validation->hasError('nomor_hak') ? 'is-invalid' : ''; ?>" id="nomor_hak" value="<?= old('nomor_hak'); ?>"> </div> <div class="mb-3"> <label for="kelurahan" class="form-label">Kelurahan</label> <input type="text" name="kelurahan" class="form-control <?= $validation->hasError('kelurahan') ? 'is-invalid' : ''; ?>" id="kelurahan" value="<?= old('kelurahan'); ?>"> </div> <div class="mb-3"> <label for="kecamatan" class="form-label">Kecamatan</label> <input type="text" name="kecamatan" class="form-control <?= $validation->hasError('kecamatan') ? 'is-invalid' : ''; ?>" id="kecamatan" value="<?= old('kecamatan'); ?>"> </div> <div class="mb-3"> <label for="no_lemari" class="form-label">Nomor Lemari</label> <input type="number" name="no_lemari" min="1" class="form-control <?= $validation->hasError('no_lemari') ? 'is-invalid' : ''; ?>" id="no_lemari" value="<?= old('no_lemari'); ?>"> </div> <div class="mb-3"> <label for="no_rak" class="form-label">Nomor Rak</label> <input type="number" name="no_rak" min="1" class="form-control <?= $validation->hasError('no_rak') ? 'is-invalid' : ''; ?>" id="no_rak" value="<?= old('no_rak'); ?>"> </div> <button type="submit" class="btn btn-primary">Submit</button> </form>
控制器保存代码
$this->bukuModel->save([ 'nama_pemegang_hak' => $this->request->getVar('nama_pemegang_hak'), 'nama_hak' => $this->request->getVar('nama_hak'), 'nomor_hak' => $this->request->getVar('nomor_hak'), 'kelurahan' => $this->request->getVar('kelurahan'), 'kecamatan' => $this->request->getVar('kecamatan'), 'no_lemari' => intval($this->request->getVar('no_lemari')), 'no_rak' => intval($this->request->getVar('no_rak')) ]); session()->setFlashdata('pesan', 'Data berhasil ditambahkan.'); return redirect()->to('/arsip/home');
数据库表结构
字段包含:id(自增主键)、nama_pemegang_hak、nama_hak、nomor_hak、kelurahan、kecamatan、no_lemari、no_rak,其中no_lemari和no_rak为整数类型,默认值为0。
问题原因分析
最可能的原因是CodeIgniter模型未将no_lemari和no_rak加入允许批量赋值的白名单:
CodeIgniter的Model->save()方法会严格过滤字段,只有在模型的$allowedFields数组中声明的字段才会被写入数据库。如果这两个字段未被加入白名单,即使控制器传递了值,也会被模型过滤掉,数据库会使用字段默认值0存入。
其他次要排查点:
- 确认控制器获取的值是否正确:可以在保存前添加调试代码验证是否拿到了输入的非0值。
- 数据库字段是否允许非空:如果字段设置了允许空,但默认值为0,当字段未被赋值时也会存入0,但结合你能获取到表单值的情况,这个概率较低。
解决方法
- 修改模型的
$allowedFields配置:
打开bukuModel.php,找到$allowedFields数组,将no_lemari和no_rak添加进去:protected $allowedFields = [ 'nama_pemegang_hak', 'nama_hak', 'nomor_hak', 'kelurahan', 'kecamatan', 'no_lemari', // 新增 'no_rak' // 新增 ]; - 验证数据获取是否正常:
若修改模型后问题仍存在,在控制器保存代码前添加调试代码,确认请求值是否正确:
如果输出为var_dump($this->request->getVar('no_lemari'), $this->request->getVar('no_rak')); exit;0或null,则需要检查表单提交是否存在问题(比如字段名拼写错误、前端验证拦截等);如果输出正确的数值,再排查模型的其他逻辑(如是否有beforeSave钩子篡改了值)。
内容的提问来源于stack exchange,提问作者Dragonarc
相关产品推荐
相关产品推荐

