我在密码恢复过程中遇到了一个奇怪的错误。 当用户丢失他的密码时,应用程序会在恢复链接中发送带有令牌的电子邮件(例如http://localhost/reset-password/f38fd00aa975b28c70f54d948d20de40)此令牌是用户表中的唯一密钥。
在routes.php中,我有:
$route['reset-password/(:any)'] = "/user/reset_password_form/$1";// new password form
$route['reset-password'] = "/register/reset_password"; //simple email form
然后,reset_password_form生成一个表格,其中令牌为隐藏输入:
public function reset_password_form($hash = NULL) { //create form to change password, with user validation hash inside
$user_id = $this->user_model->get_id_by_confirmation_code(strip_tags($hash));
if (isset($user_id)) {
$this->data['validation_code'] = $hash;
$this->data['title'] = $this->lang->line('user_title_password_edit', FALSE);
$this->template->load('default', 'register/reset_password_form', $this->data);
}
else{
$this->session->set_flashdata('error', $this->lang->line('user_error_reset_password', FALSE));
redirect('reset-password');
}
观点:
<?php $attributes = array('class' => '');
echo form_open('user/edit_password', $attributes) ?>
<input type="hidden" id="validate" name="validate" value="<?=$validation_code?>">
<div class="form-group">
<input type="password" id="password" name="password" placeholder="Password" class="form-control" value="<?php echo set_value('password'); ?>">
</div>
<div class="form-group">
<input type="password" id="password_confirm" name="password_confirm" placeholder="Password confirmation" class="form-control">
</div>
<button type="submit" name="submit" class="btn btn-success">Change password</button>
</form>
最后,user / edit_password函数会更改用户密码。
public function edit_password() { //get new password and change it
$this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[6]');
$this->form_validation->set_rules('password_confirm', 'Confirm Password', 'trim|required|matches[password]');
$this->form_validation->set_rules('validate', 'Validate', 'trim|alpha_numeric|required');
if ($this->form_validation->run() === false) {
//STRANGE BUG
$URL = '/reset-password/'.$this->input->post('validate');
$this->session->set_flashdata('error', validation_errors());
redirect($URL);
}
else {
//change pssword
}
}
当表单验证失败时会发生错误:我可能会使用flashdata错误消息重定向到上一个表单(/ reset-password / hash),但错误消息不会显示。< /强>
更奇怪:即使我在正确的表格上(但没有错误信息)如果我决定点击另一个菜单项(例如/ home),它会立即显示/重置 - 密码表格(路由中的/ register / reset_password)以及之前应该获得的错误消息。
好像完整的php指令保存在邮票中并在任何操作后启动。
PS:由于edit_password()和reset_password_form()在同一个控制器中,我可以使用$ this-&gt; reset_password_form($ hash)而不是redirect(),但它具有完全相同的效果!
ps2:这是寄存器/ reset_password:
public function reset_password() {
//display forgotten password form page
$this->data['title'] = 'Forgotten password';
$this->template->load('default', 'register/reset_password', $this->data);
}
答案 0 :(得分:0)
您的恢复链接http://localhost/reset-password/f38fd00aa975b28c70f54d948d20de40找不到控制器。 CI正在寻找您的令牌号码作为控制者