|
|
|
| Вот такая простая програмка:
<form method=POST action=?>
<input name=test />
</form>
<?php
$t = $_POST['test'];
echo"$t <br/>";
?>
|
После того как отсылаю перменную "test" - она выводится на экран - нормально.
Но если нажать F5 или значёк перезапуска, то значение переменной опять печатается.
Почему это происходит?
Откуда скрипт берёт в этом случае значение test?
Как от этого вылечиться? | |
|
|
|
|
|
|
|
для: Eugene77
(22.06.2007 в 18:32)
| | Мне только один вариант видится - аяксом эту штуку обрабатывать :)) | |
|
|
|
|
|
|
|
для: Eugene77
(22.06.2007 в 18:32)
| | задача 21 одноименного раздела - одно из вторичных требований.
См. решение 5.
Формально, надо лечиться не только от повторного поста, но и от любого повторного запроса, совершаемого ради активного действия. Т.е. побочным эффектом вносящего изменение в состояние сервера. | |
|
|
|
|
|
|
|
для: Trianon
(22.06.2007 в 19:17)
| | Спасибо за подсказку, я уже сам вспомнил и туда залез, но там коментарии чисто обозревательные: какая строка что делает, да и терминология... "активных действий".
Хотя бы немного теории надо... пофилософствовать может чуточку на эту тему. Может предисторию какую-то рассказать, ну на худой конец анекдот.
У меня ведь ещё два вопроса в поусте есть! | |
|
|
|
|
|
|
|
для: 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] человек не касался. Пытаться повторно выполнять удаление - неправильно. | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2007 в 01:42)
| | $back=$_SERVER['HTTP_REFERER'];
header("Location:$back"); | |
|
|
|
|
|
|
|
для: 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
организовать, да не соображу как. | |
|
|
|
|
|
|
|
для: Trianon
(23.06.2007 в 01:42)
| | Всё это интересно, здорово, но, честно говоря, недостаточно познавательно!
Я действительно хочу понять чем отличается "Хорошо спроектированный интерфейс" от плохо спроектированного, но только не в смысле описания результатов его работы, а в смысле деталей конструкции. Какие элементы конструкции интерфейса переводят его из одной категории в другую? Это словами сказать можно? Или только скриптом? | |
|
|
|
|
|
|
|
для: Eugene77
(24.06.2007 в 20:55)
| | Хорошо спроектированный интерфейс- это, как я понимаю, программа, способная адекватно реагировать на ЛЮБЫЕ действия юзера (в windows это называется "защита от дурака"). Теоретически.;) Соответственно, плохо спроектированный не предусматривает некоторые действия извне. Отсюда и возникают различные дыры в скриптах. | |
|
|
|
|
|
|
|
для: Eugene77
(24.06.2007 в 20:55)
| | >Какие элементы конструкции интерфейса переводят его из одной категории в другую?
Применительно к разговору об F5 после активных действий - наличие клиентского редиректа на пассивный GET-запрос в обработчике запроса активного действия (независимо от типа)
header("Location: http://site.adr/......"); | |
|
|
|
|
|
|
|
для: Trianon
(24.06.2007 в 23:36)
| | Так понятно.
Ну, в смысле понятно как писать программу. Спасибо!
Но я не только это хотел понять,
а вообще изначальную причину: почему возникает повторная обработка отправленного POST ом
сообщения? Казалось бы обмен между сервером и клиентом мог быть построен более рационально! Это я подразумевал под "философией".
Но кроме "философии" напрашивается и ещё один уточняющий вопрос:
От каких действий кроме F5 ещё нужно бывает ставить защиту? | |
|
|
|
|
|
|
|
для: Trianon
(24.06.2007 в 23:36)
| | Вообще, это тема очень интересная и судя по малому количеству подсказок для меня - ещё многими не освоенная.
Тогда я совсем не понимаю, что происходит с задачей 21 !
В ней такие важные вопросы подняты!
Я уже свою версию решения написал. Кто-нибудь из опытных может посмотреть?
А что стало с остальными участниками я так и не понял. | |
|
|
|