Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как вылечиться от повторного POST а
 
 автор: Eugene77   (22.06.2007 в 18:32)   письмо автору
 
 

Вот такая простая програмка:


<form method=POST action=?>
<input name=test />
</form>
<?php
$t 
$_POST['test'];
echo
"$t <br/>";
?>


После того как отсылаю перменную "test" - она выводится на экран - нормально.
Но если нажать F5 или значёк перезапуска, то значение переменной опять печатается.

Почему это происходит?
Откуда скрипт берёт в этом случае значение test?
Как от этого вылечиться?

   
 
 автор: Richard Ferlow   (22.06.2007 в 19:08)   письмо автору
 
   для: Eugene77   (22.06.2007 в 18:32)
 

Мне только один вариант видится - аяксом эту штуку обрабатывать :))

   
 
 автор: Trianon   (22.06.2007 в 19:17)   письмо автору
 
   для: Eugene77   (22.06.2007 в 18:32)
 

задача 21 одноименного раздела - одно из вторичных требований.
См. решение 5.

Формально, надо лечиться не только от повторного поста, но и от любого повторного запроса, совершаемого ради активного действия. Т.е. побочным эффектом вносящего изменение в состояние сервера.

   
 
 автор: Eugene77   (22.06.2007 в 20:29)   письмо автору
 
   для: Trianon   (22.06.2007 в 19:17)
 

Спасибо за подсказку, я уже сам вспомнил и туда залез, но там коментарии чисто обозревательные: какая строка что делает, да и терминология... "активных действий".
Хотя бы немного теории надо... пофилософствовать может чуточку на эту тему. Может предисторию какую-то рассказать, ну на худой конец анекдот.
У меня ведь ещё два вопроса в поусте есть!

   
 
 автор: Trianon   (23.06.2007 в 01:42)   письмо автору
 
   для: Eugene77   (22.06.2007 в 20:29)
 

Пофилософствовать - это завсегда пожалуйста :))
да и на вопросы по коду я обычно отвечаю.

активное действие...
Ну то, что POST-форма является активной - это нам каждый раз подсказывает IE.
C GET-запросами немного запутаннее.
Такой пример рассмотрим. Лента событий. События поступают в низ ленты в реальном масштабе времени - возможно даже через POST-форму - в данном случае это неважно.
На ленте сверху есть ссылка [drop] - удалить самое старое - самое верхнее событие.
И у каждого события есть ссылки [details] - открыть окно с полным текстом события.
и [delete] - удалить событие из ленты.
Все три реализуются через GET-запросы.

Запрос по ссылке [details] активного действия не вызывает. Сколько по этой ссылке не щелкай - документ будет открываться один и тот же.

Запросы по ссылке [delete] и [drop] вызыывают активные действия.
Скрипты, им соответствующие, меняют состояние системы.
Так вот, повторные нажатия на эти ссылки и нажатие F5 должны приводить к совершенно разным вещам.

нажимаем мы на [drop] . Система удаляет событие и перерисовывает экран.
Нажимаем на F5. Плохо спроектированный интерфейс повторит активный запрос и удалит еще одно событие. Столько раз сколько нажмем F5. Хорошо спроектированный интерфейс просто перерисует страницу. Опять же - ровно столько раз. Никак не изменив таблицу на сервере. Содержимое самой страницы если и изменит, то не в смысле удаления событий, а в смысле закачивания совсем свежих.
Надо еще одну удалить - еще раз щелкнем по ссылке.

Точно то же самое и с [delete].
щелчок. Запрос удаляет событие. Пишет диагностику успеха или перерисовывает ленту - не важно.
F5. Плохо спроектированный интерфейс попытается удалить событие еще раз, и возможно даже напишет сообщение - мол, такого события нет .
Хорошо спроектированный интерфейс просто перерисует окно (с лентой или с диагностикой - неважно). Второй раз ссылки [delete] человек не касался. Пытаться повторно выполнять удаление - неправильно.

   
 
 автор: moonfox   (23.06.2007 в 03:41)   письмо автору
 
   для: Trianon   (23.06.2007 в 01:42)
 

$back=$_SERVER['HTTP_REFERER'];
header("Location:$back");

   
 
 автор: Eugene77   (24.06.2007 в 21:14)   письмо автору
 
   для: moonfox   (23.06.2007 в 03:41)
 

>$back=$_SERVER['HTTP_REFERER'];
>header("Location:$back");

Кажется интересной идеей, но что-то я не могу взять в толк куда её прилепить!
Я поставил в начало


<?php
$back
=$_SERVER['HTTP_REFERER'];
header("Location:$back");
?>
<form method=POST action=?>
<input name=test />
</form>
<?php
$t 
$_POST['test'];
echo
"$t <br/>";
echo
"$t <br/>";
?>



Теперь у меня просто виснет программа.
Надо наверно проверку на заполненность переменной HTTP_REFERER
организовать, да не соображу как.

   
 
 автор: Eugene77   (24.06.2007 в 20:55)   письмо автору
 
   для: Trianon   (23.06.2007 в 01:42)
 

Всё это интересно, здорово, но, честно говоря, недостаточно познавательно!
Я действительно хочу понять чем отличается "Хорошо спроектированный интерфейс" от плохо спроектированного, но только не в смысле описания результатов его работы, а в смысле деталей конструкции. Какие элементы конструкции интерфейса переводят его из одной категории в другую? Это словами сказать можно? Или только скриптом?

   
 
 автор: amigo62   (24.06.2007 в 21:42)   письмо автору
 
   для: Eugene77   (24.06.2007 в 20:55)
 

Хорошо спроектированный интерфейс- это, как я понимаю, программа, способная адекватно реагировать на ЛЮБЫЕ действия юзера (в windows это называется "защита от дурака"). Теоретически.;) Соответственно, плохо спроектированный не предусматривает некоторые действия извне. Отсюда и возникают различные дыры в скриптах.

   
 
 автор: Trianon   (24.06.2007 в 23:36)   письмо автору
 
   для: Eugene77   (24.06.2007 в 20:55)
 

>Какие элементы конструкции интерфейса переводят его из одной категории в другую?

Применительно к разговору об F5 после активных действий - наличие клиентского редиректа на пассивный GET-запрос в обработчике запроса активного действия (независимо от типа)
header("Location: http://site.adr/......");

   
 
 автор: Eugene77   (25.06.2007 в 21:33)   письмо автору
 
   для: Trianon   (24.06.2007 в 23:36)
 

Так понятно.
Ну, в смысле понятно как писать программу. Спасибо!
Но я не только это хотел понять,
а вообще изначальную причину: почему возникает повторная обработка отправленного POST ом
сообщения? Казалось бы обмен между сервером и клиентом мог быть построен более рационально! Это я подразумевал под "философией".

Но кроме "философии" напрашивается и ещё один уточняющий вопрос:
От каких действий кроме F5 ещё нужно бывает ставить защиту?

   
 
 автор: Eugene77   (26.06.2007 в 20:18)   письмо автору
 
   для: Trianon   (24.06.2007 в 23:36)
 

Вообще, это тема очень интересная и судя по малому количеству подсказок для меня - ещё многими не освоенная.

Тогда я совсем не понимаю, что происходит с задачей 21 !
В ней такие важные вопросы подняты!
Я уже свою версию решения написал. Кто-нибудь из опытных может посмотреть?

А что стало с остальными участниками я так и не понял.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования