У меня странная ошибка в процессе восстановления пароля. Когда пользователь теряет свой пароль, приложение отправляет электронное письмо с токеном внутри ссылки восстановления ( 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);
}
redirect (https://www.codeigniter.com/user_guide/helpers/url_helper.html#redirect)
. Например:redirect($URL, 'refresh');
- person Nil'z   schedule 09.03.2016/register/reset_password
код. - person Tpojka   schedule 09.03.2016if ($this->form_validation->run() === false) {
вы должны загружать просмотр, а не перенаправление. Ознакомьтесь с основными документами. - person Tpojka   schedule 09.03.2016