Обработка формы - использовать сессии, или нет?

Фанат

oncle terrible
Команда форума
Так нету никаких причин, как выяснилось.
обработал ввод, получил ошибку, загнал в сессию, перенаправил, прочитал данные и ошибку, вывел, из сессии стёр.
 

Demiurg

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

Фанат

oncle terrible
Команда форума
Demiurg
Спасибо за ценный комментарий.
Я думаю, те девелоперы которые озаботятся таким экхотическим случаем, обязательно встроят в сои системы его поддержку.
Лично меня же вполне устроит предложенный вариант.

-~{}~ 24.01.05 17:18:

_RVK_
прикол в том, что никакого идентификатора в урле не нужно, получается
 

svetasmirnova

маленький монстрик
Фанат
Прежде всего, спасибо :) Раньше я как-то несистематично решала обсуждаемую проблему.
Вопрос такой. Тебя вот в это место rfc2616 ткнули:
Responses to this method are not cacheable, unless the response
includes appropriate Cache-Control or Expires header fields. However,
the 303 (See Other) response can be used to direct the user agent to
retrieve a cacheable resource.

POST requests MUST obey the message transmission requirements set out
in section 8.2.
или куда ещё?
Только что попробовала со [всеми] возможными заголовками. В Мозиллах, NN4 и Opera под WinXP всё так и есть, а в IE, похоже, придётся таки редиректом. Я не права? Кто-нибудь опровергнет?
 

Фанат

oncle terrible
Команда форума
ну, не столько ткнули, сколько показали работающий вариант
вот, к примеру.
http://politizdat.ru/book/168/
жмем внизу на сабмит, уходим в сторону, возвращаемся.

а я уже, поглядев на это безобращие, полез в рфц
собственно, это все в ру_пхп есть
 

betik

Новичок
Извращенцы...
Посетители интернета - грязные животные. Всё равно не поймут =)
 

Falc

Новичок
2Фанат

Если данные в сессиии мы не индентифицируем и храним всего долю секунды, тогда что будет если:

Пользователь заполнил форму некорректно, нажал сабмит, получил сообщения об ошибках, нажал F5?
 

Фанат

oncle terrible
Команда форума
ровно то же самое, что происходило, когда он первый раз нажал сабмит
 

Gas

может по одной?
Фанат
разве? если при заполнении была ошибка, то при F5 появится пустая форма?
 

Falc

Новичок
Фанат
>>ровно то же самое, что происходило, когда он первый раз нажал сабмит

Хорошо, тогда между сабмитом формы и нажатием F5, он в соседнем окне нажал сабмит в другой форме. Что получится?
 

Фанат

oncle terrible
Команда форума
Это зависит от того, правильно ли он заполнил ту форму.
если прваильно - то инфа запишется в базу, а если неправильно - то он получит вторую форму с ошибкой, и я бы на его месте задумался о том, чтобы быть повнимательнее

-~{}~ 27.01.05 16:24:

Gas не понял. а откуда там возьмется пустая форма?
ты имеешь в виду, что он нажал сабмит с пустыми полями? Тогда да - ему выведется пустая.
 

Falc

Новичок
Фанат
Просто после твоих слов:

"обработал ввод, получил ошибку, загнал в сессию, перенаправил, прочитал данные и ошибку, вывел, из сессии стёр."

Мне и похоже Gas'у, показалось что после первого отображения сообщения об ошибке данные из сесии удалятся и при повторном запросе данной страницы она окажется пустой.
 

Фанат

oncle terrible
Команда форума
а, да.
это я тормознул.
Действительно, форма окажется пустой.
 

Falc

Новичок
Так что все-таки индентифицировать форму надо. Передавать ее индентификатор в гете и данные из сесиии не удалять.

Правда тогда может получится что в сессии накопится очень много данных, но это уже другая проблема.
 

_RVK_

Новичок
Фанат
Falc
и д.р.
Вам не кажется что есть смысл говорить на основе некоторого кода а не держать его в голове. Не все такие умные дядьки.
И все сказанное проверять.

-~{}~ 27.01.05 16:49:

Да и таких постов что выше моего будет поменьше....
 

Фанат

oncle terrible
Команда форума
Falc
Тут мы имеем коллизию не совсем технического толка.
Я думаю, решение этого вопроса надо оставить на усмотретие программиста.
Таки да - форма окажется пустой.
Однако, от пользователя и не требовалось нажимать ф5.
от него требовалось исправить ошибки и нажать сабмит.
собственно, если он нажмет не ф5, к примеру, а бэкспэйс, то тоже своей формы не увидит.

Так что, я не думаю, что долговременное хранение данных в сесмии - это ОБЯЗАТЕЛЬНЫЙ вариант.
Тем более, что сам склоняюсь к старому варианту, плюс кэширование.

_RVK_
Да, я все собираюсь сделать как-нибудь такую штуку
 

Falc

Новичок
Фанат
Дело в том что данные после сабмита пользователь может не получить, например сервер затормозит или коннект оборвется, и он будет просто вынужден нажать F5.
А исчезновение введенных данных гораздо большая проблема нежили появление той таблички, которая появляется без редиректа.
 

Фанат

oncle terrible
Команда форума
Да я не спорю совсем.
Если девелопер так считает - пусть хранит долго.

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

_RVK_

Новичок
_RVK_
Да, я все собираюсь сделать как-нибудь такую штуку
Тебе помочь?

Вариант с идентификатором:
PHP:
<?php
if ($_SERVER['REQUEST_METHOD']=='POST') {
    //Если передана форма проверяем ошибки
    if (empty($_POST['var'])) {
        //Стартуем сессию
        session_start();
        //Сохраняем переменные и текст ошибки
        $_SESSION['var1'] = $_POST['var1'];
        $_SESSION['err_mes'] = 'Вы не заполнили нужное поле';
        $_SESSION['FID'] = rand();
        //Уходим на форму
        header('Location:'.$_SERVER['PHP_SELF'].'?fid='.$_SESSION['FID']);
        exit;
    } else {
        //Все верно убиваем сессию
        session_start();
        session_destroy();
        //И делаем редирект
        header('Location:'.$_SERVER['PHP_SELF']);
        exit;
    }
}
//Если нужно стартуем сессию
if (isset($_REQUEST[session_name()])) session_start();
//Если идентификатор верный то будем выводить ошибки
if ($_GET['fid']==$_SESSION['FID']) $err=true;
?>
<html>
  <head>
    <title>Пример</title>
  </head>
  <body>
  <?php print (isset($err)) ? $_SESSION['err_mes'] : ''; ?>
     <FORM method=POST action=<?php print $_SERVER['PHP_SELF']?>>
     <INPUT NAME=var>*<br />
     <INPUT NAME=var1 value="<?php print (isset($err)) ? $_SESSION['var1'] : ''; ?>"><br />
     <INPUT type=submit><br />
     </FORM>
  </body>
</html>
 
Сверху