Сохранение данных в форме при нажатии на кнопку назад&повторная отправка ПОСТзапросов

zerkms

TDD infected
Команда форума
Сохранение данных в форме при нажатии на кнопку назад&повторная отправка ПОСТзапросов

привет всем - к вам с старым как жизнь (?) вопросом, на который я не могу найти ответа:

как сдклать, чтобы при нажатии на кнопку "Back" (назад) бродилки у меня сохранялись данные, введённые в форму на страницу, на которую я возвращаюсь...

и трабла, близкая к вышеописанной:

как сделать, чтобы при нажатии на кнопку Назад и возврату к прошлой странице не появлялось сообщение
"Warning: Page has Expired" (Внимание: страница устарела )

(всё это реализовано на данном форуме)

(хотя проблема сообщения об устаревшей странице не устранена (?) на www.mail.ru)

если не сложно - объясните пожалуйста природу возникновения данных проблем и варианты решения....
 

lucas

Guest
как сделать, чтобы при нажатии на кнопку Назад и возврату к прошлой странице не появлялось сообщение
"Warning: Page has Expired" (Внимание: страница устарела )
Значит так. Слушаем и внимаем азбуку.

Если происходит посылка данных POST'ом, то принимающий скрипт должен сделать следующее:

1. Данные неверны -- например, выводим их на ту же страницу, просим исправить.

2. Данные верны -- делаем с ними все, что душе угодно, а затем ОБЯЗАТЕЛЬНО ПЕРЕАДРЕСАЦИЮ таким образом:
PHP:
header('Location: http://host/path') ;
 

zerkms

TDD infected
Команда форума
спасибо, понятно

а как быть с формами??

зы: header('Refresh: '.$paus.'; URL=' . $url);

принципиально отличается от

header('Location: http://host/path') ;
 

lucas

Guest
Отличие в том, что Location прописан в стандарте и поддерживается всеми браузерами.

Refresh, возможно, тоже поддерживается, но по сути представляет собой глупейшую, никому не нужную затычку для эмуляции HTML'ного meta refresh.

Вывод: забыть про Refresh, всегда юзать Location.
 

zerkms

TDD infected
Команда форума
хм..... понятно, а как тогда сделать задержку при выведении какого нить сообщения вроде "сообщение успешно добавлено" etc...

в рефреше есть пауза, а локейшном как??

или делать так: страница "1.пхп" с формой отрабатывает action на себя, при обработке инфы редиректит location'ом на страницу "2.пхп" с сообщением "ваше сообщение успешно отправлено - спите спокойно..."

тогда ещё 2 вопроса:

1. как передавать текст сообщения из 1.пхп в 2.пхп
2. как по временной задержке редиректить юзверя со страницы 2.пхп на например страницу с его сообщением??

или подход неверен??
 

lucas

Guest
а как тогда сделать задержку при выведении какого нить сообщения вроде "сообщение успешно добавлено" etc...
ИМХО, этого не нужно хотеть, так как пользы от этого -- ровный ноль.
 

zerkms

TDD infected
Команда форума
эм........
позволю при своей некомпетенции, но всё же, не согласиться - должна же быть информация, которая показывает результат выполнения команды...

например на этом форуме - есть же страницы "поиск выполнен, сейчас вас перекинет на результаты" или подобное сообщение об удачном добавлении поста??
 

voland

Guest
Честно говря поддержу, это же рассчитано на аудиторию, которая ищет кнопку ОК на клавиатуре... И ИМ надо видеть, что то, что они хотели сделать сделалось...
 

lucas

Guest
Если так уж хочется это сделать, то делаем:
1. 1.php получает данные, мучает их, затем...
1. Переадр. на 2.php?param=foo (или foo.php, но тогда придется делать много файлов) через header Location.
2. В этом файле в завис. от foo отобр. сообщ., затем переадр. на друг. страницу через meta refresh.
 

zerkms

TDD infected
Команда форума
хм...... принцип ясен, но если в этот foo должен передаваться какой нить параметр, например урл на созданное сообщение/новость и т.д.

передавать в урле??????

громоздко в итоге получается, для каждого сообщения по файлу........

хотя мона инклудить один а сообщение выбирать исчо одним параметром...... кароч будем думать....

спасибо за внимание
 

voland

Guest
Ведь можно форму и обрабатывающий её код положить в один файл... вместе с сообщением!
 

lucas

Guest
voland

...то есть децентрализовать вывод сообщений?
Хм, возможно, это будет удобно.
 

zerkms

TDD infected
Команда форума
Ведь можно форму и обрабатывающий её код положить в один файл... вместе с сообщением!
т.е. локейшном указывать на себя?

получается редиректить на себя........

зы: смотрел код пхпББ (я у них взял функцию редиректа через хеадер рефреш) - у них эта проблема решена........

может есть другая причина??
 

Bosha

Новичок
Автор оригинала: lucas
Если так уж хочется это сделать, то делаем:
1. 1.php получает данные, мучает их, затем...
1. Переадр. на 2.php?param=foo (или foo.php, но тогда придется делать много файлов) через header Location.
2. В этом файле в завис. от foo отобр. сообщ., затем переадр. на друг. страницу через meta refresh.
А мне здается что этот вариант удобнее. 2.php можно испльзовать для вывода сообщений для многих форм.
При переадресации на конечную страницу ей не прийдется в урл дописывать никаких параметров.
А если все сделать в файле с формой прийдется передавать ей этот самый param=foo
 

zerkms

TDD infected
Команда форума
voland
у меня так и сделано..... - в функцию передаётся тип сообщения, текст,и несколько др. параметров........
но изначально проблема не в этом......
а в - см. 1-ый пост..........

-~{}~ 29.07.04 16:53:

её решение уже есть....... вроде.... ))
 

zerkms

TDD infected
Команда форума
Для этого надо передавать данные через GET
хм........ а POST ???

-~{}~ 29.07.04 17:04:

реальное решение проблемы уже было описано выше.......

немного модифицированное, я буду его использовать
 

zerkms

TDD infected
Команда форума
voland

хм..... а при чём тут GET если я всё передаю POSTом??

-~{}~ 30.07.04 15:16:

привет все...
выношу вам на суд результат:

(псевдокод)

some_script.php:
PHP:
<?php
...
switch ( $m ) {
   case 'message_type_1':
   вывод ссобщния типа 1
   break;
....
}

обработка формы
if ( всё верно ) {
redirect ( _SERVER['PHP_SELF'] . '?m=ok');
} else {
redirect ( _SERVER['PHP_SELF'] . '?m=error_type');
}

форма

?>
самый большой недостаток данного метода имхо заключается в том, что иногда кроме результата выполенния операции $m прходится исчо передавать и некоторые другие переменные

зы: а ещё я заметил, что если делать рефрешь с инетрвалом 0 (фактически редирект), то при возвращении назад глюк с повторной отправкой ПОСТ запроса не возникает, а если поставить >= 1 секунды, то данный трабл возникает.
естественный вопрос: как на данном форуме сделано, что сообщение выдаётся корректно, но в урле доп переменных не возникает, т.е. скрипт сразу обрабатывает, и после обработки без дополнительных перемещений выдаёт всё корректно....

я запутался......

-~{}~ 30.07.04 15:54:

так.....

открываем код страницы с сообщением этого форума:

<html>
<head><title>PHPClub Forums</title>
<meta http-equiv="Refresh" content="1; URL=showthread.php?s=&amp;postid=362659#post362659">
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>

у меня:

<html>
<head>
<title>some title</title>
<meta http-equiv="Refresh" content="20; URL=some_script.php#comment246">
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>

почему здесь всё нормально, а у меня нет?
 
Сверху