Отправка по тому же URL в CodeIgniter
Вы описали распространенный сценарий.Вы хотите загрузить страницу с формой, выполнить запрос POST, проверить запрос, а затем показать ошибки, если есть проблема.Есть некоторые потенциальные проблемы, о которых следует знать, если вы делаете это:
- После успешного сообщения, что произойдет, если браузер выполнит обновление страницы?
- После успешного сообщенияЧто произойдет, если пользователь перейдет на другую страницу, но затем вернется в историю?
Обе эти проблемы представляют собой повторяющуюся проблему, и это никогда не желательно.Чтобы решить эту проблему, используйте маркер формы.Токен формы генерируется во время загрузки страницы, где присутствует форма.Значение обычно представляет собой случайную строку символов и помещается в двух местах:
- В форме в виде скрытого поля формы.
- В сеансе или файле cookie.
Когда форма публикуется, значение токена в скрытом поле формы передается вместе с остальными опубликованными данными.Поскольку существует сеанс или файл cookie, содержащие одно и то же значение, контроллер / метод, который публикуется, может проверить, совпадают ли они, и если они есть, то может быть выполнена проверка, а также вывод сообщений об ошибках или об успехе.В любом случае генерируется новый токен формы, поэтому два сообщения никогда не будут содержать один и тот же токен формы.
Краткое изложение основной концепции
// You of course have to start the
// session for this to work.
$this->load->library('session');
if(
isset( $_POST['token'] ) &&
isset( $_SESSION['token'] ) &&
$_POST['token'] == $_SESSION['token']
){
// Do validation ...
// ...
// If validation passes
if( $this->form_validation->run() ){
$valid = TRUE;
}
// If there were validation errors
else{
$errors = validation_errors();
}
}
if( isset( $errors ) )
{
// Display the errors
}
if( isset( $valid ) )
{
// Display a thank you message
}
// Always refresh the token
$token = substr(md5(uniqid() . microtime() . rand()), 0, 8);
$_SESSION['token'] = $token;
?>
<form method="POST">
<input type="text" name="x" />
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="submit" value="submit" />
</form>
На практикеэта концепция токенов может быть гораздо более сложной.Например, вы можете выбрать шифрование значений токенов, а затем расшифровывать их при проверке на совпадение.Вы также можете создать массив токенов в своем сеансе / файле cookie и проверить свой опубликованный токен по массиву токенов.У вас могут быть другие идеи о том, как настроить токены форм, но основы были представлены здесь, и я надеюсь, что это поможет вам достичь вашей цели публикации по тому же URL-адресу в CodeIgniter.