<FORM> + Refresh + PHP
Хотелось бы узнать каким образом запретить повторную отправку данных из формы (POST) при обновлении страниц не используя сессии и тп на PHP.
Заранее спасибо.
====
PS. В одной книжке приводился простенький пример (что-то связанное со штампом времени), что-то книжку не вспомню.
А чем сессии не устраивают?
не разобрался я еще с сессиями, да и нет в них необходимости
Тогда стоит разобраться тк это самый простой способ решения вашей проблемы. Все остальные намного сложнее.
...самопереадресация — это как раз то средство, которое позволяет разрешить рас-
смотренный конфликт в сторону пользователя. В самом деле, предположим, что при
получении уведомления о новом сообщении генератор данных вставляет их в базу
данных, а затем посылает браузеру заголовок, заставляющий его перезагрузить стра-
ницу гостевой книги. В этом случае страница уже не будет представлять собой ре-
зультат работы метода POST, это будет обычный HTML-документ, загруженный с
сервера, как будто бы пользователь считал файл только что самостоятельно и "вруч-
ную". Неудивительно, что кнопка браузера Обновить будет работать так, как ей и
положено.
Впрочем, при использовании самопереадресации очень легко наткнуться на один не-
приятный "подводный камень". Это — ошибка некоторых версий браузера Netscape,
заключающаяся в том, что любые страницы, полученные им в результате самопере-
адресации, он ошибочно принимает за пустые (и соответственно отображает). И все
же выход есть: достаточно немного модифицировать URL страницы, чтобы браузер
"подумал", что это уже другой документ, а не тот же самый. Листинг 33.3 показывает,
как это можно сделать. В целях экономии места я разместил шаблон страницы и ге-
нератор данных в одном файле.
Листинг 33.3. Самопереадресация
<?
// Считываем содержимое базы данных.
$Book=@Unserialize(join("",File("book.dat")));
if(!$Book) $Book=array();
// Проверяем, не нужно ли добавить запись...
if(@$Go) {
array_unshift($Book,$Text);
$f=fopen("book.dat","w");
fwrite($f,Serialize($Book));
fclose($f);
// Внимание! Самопереадресация. Обратите внимание на то,
// какой заголовок мы посылаем.
Header("Location: http://$HTTP_HOST$REQUEST_URI?".time());
exit; // Завершить сценарий.
}
?>
<form action=sr.php method=post>
Введите текст:<br>
<input type=text name=Text><br>
<input type=submit name=Go value="Go!">
</form>
<?foreach($Book as $k=>$v) {?>
<?=$v?>
<hr>
<?}?>
Мы обеспечиваем "уникальность" URL страницы гостевой книги за счет добавления в
его конец текущего времени в секундах, прошедших с 1 января 1970 года (так назы-
ваемый Unix timestamp). Вряд ли пользователь будет обновлять страницу чаще, чем
раз в секунду, поэтому такой способ прекрасно подходит для наших целей.
Обратите внимание на то, что в заголовке Location мы передаем полный URL стра-
ницы, включая имя хоста. Большинство браузеров умеют "понимать" и сокращенные
пути (например, без указания имени сервера), но некоторые — нет, так что лучше не
искушать судьбу.
Котеров Д.В. Самоучитель PHP 4. — СПб.: БХВ-Петербург, 2001.
Если бы работали с сессиями - нужно было бы всего 4 строки чтобы решить вашу проблему.
Header("Location: http://$HTTP_HOST$REQUEST_URI?".time());
На сколько я понимаю - сессии предназначены в первую очередь, чтоб уникально идентифицировать пользователя и пренадлежащие ему данные на время посещения сайта, а уж потом для других целей - на то и PHP. Однако, может я и ошибаюсь.
Цитата: intro-nikol
а в примере всего одна...
Header("Location: http://$HTTP_HOST$REQUEST_URI?".time());
На сколько я понимаю - сессии предназначены в первую очередь, чтоб уникально идентифицировать пользователя и пренадлежащие ему данные на время посещения сайта, а уж потом для других целей - на то и PHP. Однако, может я и ошибаюсь.
Header("Location: http://$HTTP_HOST$REQUEST_URI?".time());
На сколько я понимаю - сессии предназначены в первую очередь, чтоб уникально идентифицировать пользователя и пренадлежащие ему данные на время посещения сайта, а уж потом для других целей - на то и PHP. Однако, может я и ошибаюсь.
=))) Вы наивно полагает что тем самым решили проблему? Это всего лишь редирект. Попробуйте нажать пару раз кнопку "Назад" в браузере, а после этого пару раз нажать "Вперед" и ваша проблема опять проявится.
Код:
header("Location: /index.php");
exit;
exit;
и всетаки, умные люди подсказали что редирект применять надо
В отображаемой странице после формы вставляем
<script ...>
setTimeout('document.location.replace("куда_перенаправлять");', 3000);
</script>
Через 3 секунды юзер будет перенаправлен, и запись об этом не сохранится в истории браузера, соответственно он не сможет вернутся назад
А вообще лучше использовать предложение foxweb, т.к скрипты могут быть отключены
p.s: я мог ошибится в расположении метода replace(), если не работает - посмотри по докам