CodeIgniter编辑数据时NIP唯一性校验异常问题求助
解决CodeIgniter编辑数据时NIP唯一性校验的问题
看起来你在做编辑页面的NIP唯一性校验时遇到了逻辑问题,咱们一步步来修正它。首先得指出你现有代码里的核心问题:用result()返回的对象数组直接做相等比较是不准确的,而且逻辑绕了弯路,导致无法正确区分"当前记录的NIP"和"其他记录的NIP"。
问题分析
你的三个校验场景核心是要区分:
- 输入的NIP是全新的 → 允许
- 输入的NIP就是当前编辑记录自己的 → 允许
- 输入的NIP属于其他记录 → 禁止
但你原来的代码里,$hasil_nip和$hasil_cek都是对象数组,用==比较两个数组的结果大概率是false,所以只要NIP存在,就会走到echo "ada"的分支,这就是为什么第二种场景也会提示错误。
修正方案
我们可以简化逻辑,只需要两个关键查询:获取当前编辑记录的NIP,以及检查输入的NIP是否被其他记录占用。
第一步:优化模型方法
把模型里的三个方法简化成更实用的两个:
public function cek_nip_exists($nip) { // 返回该NIP存在的记录总数 return $this->db->where('nip', $nip)->count_all_results('detail_dosen'); } public function get_current_record_nip($unique_id) { // 获取当前编辑记录的NIP值 $query = $this->db->select('nip') ->where('unique_id', $unique_id) ->get('detail_dosen'); if ($query->num_rows() > 0) { return $query->row()->nip; } return null; // 处理unique_id不存在的异常情况 }
第二步:修正控制器逻辑
重新梳理判断逻辑,先判断输入的NIP是不是当前记录自己的,再判断是否被他人占用:
public function cek_nip_update() { $this->load->model("model_dosen"); $unique_id = $this->input->post('unique_id'); $nip = $this->input->post('nip'); // 获取当前编辑记录的原始NIP $current_nip = $this->model_dosen->get_current_record_nip($unique_id); // 场景2:输入的NIP就是当前记录自己的,直接允许 if ($nip === $current_nip) { echo 'gada'; return; } // 场景1:输入的NIP不存在任何记录 $nip_exists_count = $this->model_dosen->cek_nip_exists($nip); if ($nip_exists_count === 0) { echo 'gada'; } else { // 场景3:输入的NIP被其他记录占用 echo 'ada'; } }
为什么这样能解决问题?
- 用
count_all_results()直接获取记录数,避免了数组比较的坑; - 先判断输入的NIP是否属于当前记录,这是最优先的逻辑(用户编辑自己的记录时,保留原NIP是合理的);
- 剩下的逻辑只需要判断该NIP是否存在其他记录,完美覆盖三个场景。
这样修改后,你的三个预期场景就能正常工作了:
- 输入不存在的NIP → 返回
gada,无提示; - 输入当前记录的NIP → 返回
gada,无提示; - 输入其他记录的NIP → 返回
ada,显示"NIP is used by the other"。
内容的提问来源于stack exchange,提问作者Noeriel Hilal
相关产品推荐
相关产品推荐

