Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

<FORM> + Refresh + PHP

13K
29 января 2007 года
intro-nikol
17 / / 27.04.2006
Уважаемые господа эксперты.
Хотелось бы узнать каким образом запретить повторную отправку данных из формы (POST) при обновлении страниц не используя сессии и тп на PHP.

Заранее спасибо.

====
PS. В одной книжке приводился простенький пример (что-то связанное со штампом времени), что-то книжку не вспомню.
13
29 января 2007 года
RussianSpy
3.0K / / 04.07.2006
например AJAX

А чем сессии не устраивают?
13K
29 января 2007 года
intro-nikol
17 / / 27.04.2006
не разобрался я еще с сессиями, да и нет в них необходимости
13
29 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Тогда стоит разобраться тк это самый простой способ решения вашей проблемы. Все остальные намного сложнее.
13K
29 января 2007 года
intro-nikol
17 / / 27.04.2006
Нашел!!!

...самопереадресация — это как раз то средство, которое позволяет разрешить рас-
смотренный конфликт в сторону пользователя. В самом деле, предположим, что при
получении уведомления о новом сообщении генератор данных вставляет их в базу
данных, а затем посылает браузеру заголовок, заставляющий его перезагрузить стра-
ницу гостевой книги. В этом случае страница уже не будет представлять собой ре-
зультат работы метода 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.
13
29 января 2007 года
RussianSpy
3.0K / / 04.07.2006
и это по-вашему проще чем сессии?

Если бы работали с сессиями - нужно было бы всего 4 строки чтобы решить вашу проблему.
13K
29 января 2007 года
intro-nikol
17 / / 27.04.2006
а в примере всего одна...
Header("Location: http://$HTTP_HOST$REQUEST_URI?".time());
На сколько я понимаю - сессии предназначены в первую очередь, чтоб уникально идентифицировать пользователя и пренадлежащие ему данные на время посещения сайта, а уж потом для других целей - на то и PHP. Однако, может я и ошибаюсь.
13
29 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: intro-nikol
а в примере всего одна...
Header("Location: http://$HTTP_HOST$REQUEST_URI?".time());
На сколько я понимаю - сессии предназначены в первую очередь, чтоб уникально идентифицировать пользователя и пренадлежащие ему данные на время посещения сайта, а уж потом для других целей - на то и PHP. Однако, может я и ошибаюсь.



=))) Вы наивно полагает что тем самым решили проблему? Это всего лишь редирект. Попробуйте нажать пару раз кнопку "Назад" в браузере, а после этого пару раз нажать "Вперед" и ваша проблема опять проявится.

256
29 января 2007 года
foxweb
1.0K / / 27.07.2005
после получени и обработки POST-данных делай редирект на эту же или другую страницу.

 
Код:
header("Location: /index.php");
exit;
13K
29 января 2007 года
intro-nikol
17 / / 27.04.2006
и всетаки, умные люди подсказали что редирект применять надо
253
29 января 2007 года
Proger_XP
1.5K / / 07.08.2004
Можно по-другому
В отображаемой странице после формы вставляем
<script ...>
setTimeout('document.location.replace("куда_перенаправлять");', 3000);
</script>
Через 3 секунды юзер будет перенаправлен, и запись об этом не сохранится в истории браузера, соответственно он не сможет вернутся назад
А вообще лучше использовать предложение foxweb, т.к скрипты могут быть отключены
p.s: я мог ошибится в расположении метода replace(), если не работает - посмотри по докам
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог