Рассмотрим пример защиты от дублирования отправки данных посредством формы.
Для чего это нужно?
Возникает ситуация когда пользователь заполняет форму и нажимает кнопку «Отправить». Отправляемые данные записываются в базу (к примеру). Пользователю приходит некоторая страница об успешной отправке данных. После чего пользователь случайно или намерено жмет на кнопку F5 (обновить), предыдущий запрос с уже когда-то заполненными данными снова отправляется на сервер. Таким образом, заполненные ранее данные в форме отправляется заново, что не очень хорошо.
В данном примере задача решается с использованием cookies и md5 хэша данных.
Итак, код:
<?php // В случае наличия POST переменных if(count($_POST)){ // формируем строку из данных формы $long = ""; while(list($key,$value)=each($_POST)) $long .= $value; // получаем хэш строки $hash = md5($long); // отправляем кукисы с хэшем в браузер setcookie("lasthash",$hash,time()+60*60*24*30); } else $hash = 'none'; // если принятые значения lasthash не совпадают с текущим хэшом if ( $_COOKIE["lasthash"] != $hash ){ // показываем форму, либо сообщение if (!isset($_POST['send'])) echo '<form method="post"> <input type="text" name="inp"> <input type="submit" name="send"> </form>'; else echo 'Форма отправлена!'; } else { // иначе если lasthash идентичен echo 'Дублирование данных!'; } ?>
Внимание
Стоит заметить, что при работе с cookies имеется значимый недостаток – они могут быть выключены в браузере. После чего, выше описанный код не поможет решить проблему дублирования данных.
Как вариант решения проблемы: можно проверять включены ли cookies в браузере, либо вовсе не использовать cookies для этих целей.
Так же, можно производить редирект (с помощью заголовков header()) при первой же отправке формы. Несомненно существуют и другие методы защиты от дублирования данных, пожалуй мы ещё вернемся к этой теме в другой статье.