Странное поведение CI после перенаправления()

У меня странная ошибка в процессе восстановления пароля. Когда пользователь теряет свой пароль, приложение отправляет электронное письмо с токеном внутри ссылки восстановления ( http://localhost/reset-password/f38fd00aa975b28c70f54d948d20de40 например) Этот токен является уникальным ключом внутри пользовательской таблицы.

В route.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
    }   
}

Ошибка возникает при сбое проверки формы: я должен быть перенаправлен на предыдущую форму (/reset-password/hash) с сообщением об ошибке flashdata, но сообщение об ошибке не отображается.

Гораздо более странно: даже если я нахожусь в правильной форме (но без сообщения об ошибке), если я решу щелкнуть другой пункт меню (например, /home), он сразу же отобразит форму /reset-password ( /register/reset_password в маршрутах) с сообщением об ошибке, которое я должен был получить ранее.

Как будто полная инструкция php хранилась в штампе и запускалась после любого действия.

PS: поскольку edit_password() и reset_password_form() находятся в одном и том же контроллере, я мог бы использовать $this->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);
}

person Paul-Antoine Van Gansbeke    schedule 09.03.2016    source источник
comment
Попросил бы вас использовать второй параметр redirect (https://www.codeigniter.com/user_guide/helpers/url_helper.html#redirect). Например: redirect($URL, 'refresh');   -  person Nil'z    schedule 09.03.2016
comment
Показать /register/reset_password код.   -  person Tpojka    schedule 09.03.2016
comment
Nil'z - добавление параметра «обновить» ничего не меняет.   -  person Paul-Antoine Van Gansbeke    schedule 09.03.2016
comment
Tpojka, я добавил эту функцию   -  person Paul-Antoine Van Gansbeke    schedule 09.03.2016
comment
В блоке if ($this->form_validation->run() === false) { вы должны загружать просмотр, а не перенаправление. Ознакомьтесь с основными документами.   -  person Tpojka    schedule 09.03.2016
comment
Почему ? я перенаправляю пользователей после многих проверок формы в приложении, это единственное перенаправление, с которым я застрял   -  person Paul-Antoine Van Gansbeke    schedule 10.03.2016


Ответы (1)


ваша ссылка восстановления http://localhost/reset-password/f38fd00aa975b28c70f54d948d20de40 не находит контроллер. CI ищет номер вашего токена в качестве контроллера

person Mohsin Mujawar    schedule 02.09.2018