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

CodeIgniter4 更新操作中唯一名称验证异常问题求助

问题描述

使用模态框加载数据库中的角色名称值,点击更新按钮时,is_unique验证会检查名称是否已存在于数据库中。但即使未修改该名称,验证仍会触发,不符合需求。


相关代码

表单代码

<form action="<?= base_url('users/createRole'); ?>" method="post">
  <div class="modal-body">
    <input type="hidden" name="roleID" id="roleID">
    <div class="mb-3">
      <label for="inputRoleName" class="form-label">添加角色</label>
      <input type="text" class="form-control" id="inputRoleName" name="inputRoleName" placeholder="角色名称">
    </div>
  </div>
  <div class="modal-footer">
    <button type="submit" class="btn btn-primary">保存角色</button>
    <button type="button" class="btn btn-light" data-bs-dismiss="modal">关闭</button>
  </div>
</form>

(注:原表单德语标签已改为中文,便于理解)

JS代码

$(".btnEditRole").click(function() {
  const roleID = $(this).data('id');
  const inputRoleName = $(this).data('role');
  $('#modalTitle').html('更新角色数据');
  $('.modal-footer button[type=submit]').html('更新角色');
  $('.modal-content form').attr('action', '<?= base_url('users/updateRole') ?>');
  $('#roleID').val(roleID);
  $('#inputRoleName').val(inputRoleName);
  $('.modal').on('hidden.bs.modal', function() {
    location.reload(); // 模态框关闭时刷新页面
  });
});

PHP更新函数代码

public function updateRole()
{
  if (!$this->validate(['inputRoleName' => ['rules' => 'is_unique[user_role.role_name]']])) {
    session()->setFlashdata('notif_error', '<b>角色更新失败</b> 该角色名称已存在!');
    return redirect()->to(base_url('users'));
  }
  $updateRole = $this->userModel->updateRole($this->request->getPost(null, FILTER_UNSAFE_RAW));
  if ($updateRole) {
    session()->setFlashdata('notif_success', '<b>角色数据更新成功</b>');
    return redirect()->to(base_url('users'));
  } else {
    session()->setFlashdata('notif_error', '<b>角色数据更新失败</b>');
    return redirect()->to(base_url('users'));
  }
}

(注:原德语提示已改为中文)


解决方案

问题核心是默认的is_unique规则会检查整个表的唯一性,包括当前要更新的记录。需要修改验证规则,排除当前角色的ID,让验证只检查其他记录是否重复。

修改后的PHP更新函数:

public function updateRole()
{
  // 获取当前要更新的角色ID
  $roleID = $this->request->getPost('roleID');

  // 调整is_unique规则,排除当前记录
  if (!$this->validate([
    'inputRoleName' => [
      'rules' => "is_unique[user_role.role_name,role_id,$roleID]"
    ]
  ])) {
    session()->setFlashdata('notif_error', '<b>角色更新失败</b> 该角色名称已存在!');
    return redirect()->to(base_url('users'));
  }

  $updateRole = $this->userModel->updateRole($this->request->getPost(null, FILTER_UNSAFE_RAW));
  if ($updateRole) {
    session()->setFlashdata('notif_success', '<b>角色数据更新成功</b>');
    return redirect()->to(base_url('users'));
  } else {
    session()->setFlashdata('notif_error', '<b>角色数据更新失败</b>');
    return redirect()->to(base_url('users'));
  }
}

关键说明

  • is_unique[表名.字段名,排除字段,排除值]是CodeIgniter的扩展用法,用于更新场景中跳过当前记录的唯一性检查。
  • 请根据实际表结构调整参数:user_role是角色表名,role_id是表中存储角色ID的字段名(如果你的字段名是id,直接替换即可)。

内容的提问来源于stack exchange,提问作者Sebastian2513

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:32:55