重定向()后CI的奇怪行为

时间:2016-03-09 14:30:02

标签: codeigniter codeigniter-3

我在密码恢复过程中遇到了一个奇怪的错误。 当用户丢失他的密码时,应用程序会在恢复链接中发送带有令牌的电子邮件(例如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);
}

1 个答案:

答案 0 :(得分:0)

您的恢复链接http://localhost/reset-password/f38fd00aa975b28c70f54d948d20de40找不到控制器。 CI正在寻找您的令牌号码作为控制者