CodeIgniter中Category::edit()参数不足错误及数据更新验证问题
问题诊断
报错ArgumentCountError是因为调用Category::edit()时未传入必要的$category_id参数。根源出在验证失败后的重定向逻辑:
update()方法中,验证失败时尝试通过$this->request->getVar('category_id')获取ID,但视图表单里没有提交category_id字段,导致该值为空,最终重定向到/category/edit/(无参数),触发参数不足错误。- 额外问题:验证规则里的
is_unique未排除当前分类ID,更新时会误判为重复。
修复步骤
1. 补充视图表单的category_id字段
在视图的表单内添加隐藏字段,确保提交时携带category_id:
<form action="/Category/update/<?= $category['category_id'] ?>" method="post" enctype="multipart/form-data" class="form-horizontal"> <?= csrf_field(); ?> <!-- 添加隐藏字段 --> <input type="hidden" name="category_id" value="<?= $category['category_id'] ?>"> <!-- 原有表单内容不变 --> <div class="row form-group"> <div class="col col-md-3"> <label for="kategori" class=" form-control-label">Kategori</label> </div> <div class="col-12 col-md-9"> <input type="text" id="kategori" name="kategori" placeholder="Masukkan kategori" class="form-control <?= ($validation->hasError('category_id')) ? 'is-invalid' : '' ?>" autofocus value="<?= (old('kategori')) ? old('kategori') : $category['kategori'] ?>"> <div class="invalid-feedback"> <?= $validation->getError('category_id'); ?> </div> </div> </div> <br> <div class="form-group row"> <div class="col-3"></div> <div class="col-sm-4"> <button type="submit" class="btn btn-primary">Simpan</button> <a href="/Category" class="btn btn-success">Kembali</a> </div> </div> </form>
2. 优化重定向逻辑(更稳妥的方式)
直接使用update()方法已接收的$category_id参数,避免依赖请求变量:
public function update($category_id) { if(!$this->validate([ 'category_id' => [ 'rules' => 'required|is_unique[category.category_id,category_id,' . $category_id . ']', 'errors' => [ 'required' => '{field} harus diisi.', 'is_unique' => '{field} sudah terdaftar.' ] ] ] )) { // 改用方法参数里的$category_id return redirect()->to('/category/edit/' . $category_id) ->withInput(); } $data = [ 'category_id' => $category_id, 'kategori' => $this->request->getPost('kategori') ]; $this->categoryModel->EditData($data); session()->setFlashData('pesan', 'Data berhasil diubah'); return redirect()->to('/category'); }
3. 修正验证规则的is_unique逻辑
更新分类时,category_id本身是不变的,必须排除当前记录,否则会触发is_unique错误。规则修改为:
'rules' => 'required|is_unique[category.category_id,category_id,' . $category_id . ']'
其中category.category_id是表名+字段名,category_id是排除条件的字段,最后一个$category_id是当前要保留的ID值。
内容的提问来源于stack exchange,提问作者ItsmeAnn
相关产品推荐
相关产品推荐

