CodeIgniter如何避免user_course_tbl表员工与课程编码重复录入
实现防重复录入的修改方案
1. 数据库层添加联合唯一索引(兜底防护)
首先给user_course_tbl表添加staff_name和course_code的联合唯一索引,作为最后一道防重屏障,避免并发请求绕过应用层校验导致脏数据:
ALTER TABLE user_course_tbl ADD UNIQUE KEY `uk_staff_course` (`staff_name`, `course_code`);
2. 修改模型层代码,添加重复校验逻辑
修改insert_courses_for_user方法,先校验当前员工+课程的组合是否已经存在,存在则直接返回特殊标记,不存在再执行插入:
function insert_courses_for_user($data) { // 先校验员工+课程组合是否已存在 $exists = $this->db->where('staff_name', $data['staff_name']) ->where('course_code', $data['course_code']) ->count_all_results('user_course_tbl'); if ($exists > 0) { // 重复数据返回-1作为标记,方便控制器区分错误类型 return -1; } // 无重复则执行插入 $this->db->insert("user_course_tbl", $data); return $this->db->insert_id(); }
3. 修改控制器层代码,适配不同返回结果的提示
根据模型返回的结果,区分「重复」「插入失败」「插入成功」三种场景,给用户对应提示:
function insert_courses_for_users() { $this->form_validation->set_rules('user', 'User', 'required'); $this->form_validation->set_rules('courscode', 'Course Code', 'required'); // 补充表单校验不通过的处理逻辑 if ($this->form_validation->run() == FALSE) { $this->session->set_flashdata('error', validation_errors()); redirect($_SERVER['HTTP_REFERER']); } $id = $this->input->post('txtid'); $user = $this->input->post('user'); $coursecode = $this->input->post('courscode'); $insert_res = $this->Course_model->insert_courses_for_user(array('id' => $id, 'staff_name' => $user, 'course_code' => $coursecode)); if ($insert_res > 0) { $this->session->set_flashdata('success', "员工课程关联添加成功"); } elseif ($insert_res == -1) { $this->session->set_flashdata('error', "该员工已关联此课程,请勿重复添加"); } else { $this->session->set_flashdata('error', "员工课程关联添加失败,请稍后重试"); } redirect($_SERVER['HTTP_REFERER']); }
可选优化
可以在视图层添加Ajax实时校验,用户选择完员工和课程后就异步请求后端校验是否重复,提前给用户提示,减少提交后才报错的操作成本。
内容的提问来源于stack exchange,提问作者Mathee
相关产品推荐
相关产品推荐

