CodeIgniter中实现无查询参数的动态记录更新需求
解决方案:动态获取用户ID实现无查询参数的更新
嘿,我来帮你搞定这个动态更新ID的问题!你的核心痛点是当前硬编码了id=7,但实际需要更新的是提交表单的用户对应的记录,而且不想依赖URL查询参数。咱们可以从「验证用户凭证时同步获取对应ID」这个思路来解决,具体步骤如下:
1. 修改Model方法,返回验证通过的用户ID
首先打开你的forgotpassword_model.php,调整forgot_password()方法的逻辑。原来的方法只是判断账号邮箱是否匹配并返回1/0,现在我们要让它直接返回用户的ID(验证通过时),这样控制器就能拿到要更新的目标ID了。
修改后的Model代码示例:
function forgot_password() { // 获取表单提交的邮箱和账号(自动过滤XSS,CodeIgniter自带安全处理) $email = $this->input->post('email'); $account = $this->input->post('account'); // 查询匹配的用户记录 $query = $this->db->get_where('login', array( 'email' => $email, 'account' => $account )); if ($query->num_rows() === 1) { // 返回该用户的主键ID return $query->row()->id; } else { // 验证失败返回false return false; } }
2. 控制器中使用动态ID执行更新
回到你的控制器check()方法,修改接收Model返回值的逻辑,拿到用户ID后再执行更新操作:
function check(){ $this->load->helper(array('form')); $this->load->library('form_validation'); $this->form_validation->set_rules('email', 'email', 'required'); $this->form_validation->set_rules('account', 'account', 'required'); if($this->form_validation->run() == FALSE){ $this->load->view('forgotpassword'); echo "please correctly fill the form"; }else{ $this->load->model('forgotpassword_model'); // 接收Model返回的用户ID(验证通过则为数字,失败则为false) $target_user_id = $this->forgotpassword_model->forgot_password(); if($target_user_id !== false){ $data = array( 'account' => rand(155555,508888), ); // 使用动态获取的ID作为更新条件,替代原来的静态id=7 $this->db->where('id', $target_user_id); $this->db->update('login',$data); $this->load->view('forgotpassword'); echo "successfully updated"; }else{ $this->load->view('forgotpassword'); echo "invalid credentials"; } } }
为什么这个方案可行?
- 完全不需要URL查询参数:我们通过用户提交的邮箱+账号,在Model中精准定位到对应用户的ID,全程依赖表单提交的数据
- 逻辑更贴合业务:忘记密码场景下,用户只能修改自己的账号信息,这个流程既安全又合理
- 延续了你原本的代码结构,不需要大改,只做核心逻辑的调整
额外小提示
- 确保你的
login表中存在id字段作为主键,否则query->row()->id会报错 rand(155555,508888)生成的随机数有重复风险,如果需要唯一账号,可以考虑结合时间戳(比如rand(155555,508888) . time())或者使用CodeIgniter的UUID工具类生成唯一值- 建议把echo的提示信息放到视图文件中,通过
$data数组传递,这样页面结构会更整洁
内容的提问来源于stack exchange,提问作者ipchirag
相关产品推荐
相关产品推荐

