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

Форум PHP

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

 

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

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

тема: Предотвращение повторной отправки формы при нажатии F5
 
 автор: tAleks   (31.10.2006 в 14:52)   письмо автору
 
 

Как предотвратить повторную отпарвку формы например при обновлении траницы? Или когда юзер нажимает на кнопку "назад" в браузере и возвращается на форму, которая только что была отправлена. Ему браузер выдает: "Страница устарела, нужна повторная отправка данных...."

   
 
 автор: Unkind™   (31.10.2006 в 14:55)   письмо автору
 
   для: tAleks   (31.10.2006 в 14:52)
 

Например, если это сообщение в гостевой книги, то я делаю проверку на существование в БД такого же сообщения с таким же автором.

   
 
 автор: tAleks   (31.10.2006 в 17:01)   письмо автору
 
   для: Unkind™   (31.10.2006 в 14:55)
 

А я придумал такую фишку:
файл stop_f5.php:

<?php
header
("Location: http://".$_SERVER['SERVER_NAME'].urldecode($_GET['go']));
exit;
?>


функция:

function transition_stop_f5($url)
{
    header("Location: http://".$_SERVER['SERVER_NAME']."stop_f5.php?go=".urlencode($url));
    exit;
}


Проверять на наличие записи, это конечно тоже можно, но если такая задача: Движение записей вверх и вниз, по ссылке. Т.е. после нажатия ссылки, мы появляемя на той же стр. но записи поменены местами. И в строке запроса, ссылка с GET параметрами. Если нажать F5. То получается что записи опять меняются.

А в данном случае, после выполнения скрипта мы переходим на пустую страницу stop_f5.php, которая нас переадресует опять назад. Т.е. мы попадаем на ту же страницу, но уже без GET и без POST.

Ну, это я так, своим дилетантским взглядом придумал....

Прошу коментариев по данному поводу. Может я не прав? и есть подводные камни этого метода?

   
 
 автор: Unkind   (31.10.2006 в 17:25)   письмо автору
 
   для: tAleks   (31.10.2006 в 17:01)
 

Ну от F5 может и спасти, конечно, но если у него тормозит интернет, он может не успеть получить Location: ... и отправить еще раз.

   
 
 автор: tAleks   (31.10.2006 в 19:04)   письмо автору
 
   для: Unkind   (31.10.2006 в 17:25)
 

Тогда еще вопрос. Какие еще есть разумные методы решения данного вопроса?

   
 
 автор: Unkind   (31.10.2006 в 19:52)   письмо автору
 
   для: tAleks   (31.10.2006 в 19:04)
 

:) А чем проверка на наличие в БД не подходит?
Ну можно на сессиях...

   
 
 автор: tAleks   (31.10.2006 в 21:45)   письмо автору
 
   для: Unkind   (31.10.2006 в 19:52)
 

>:) А чем проверка на наличие в БД не подходит?

Ну например Корзина.... там кнопка "Обновить, подсчитать." Если делает подсчет в корзине, потом переходит дальше, и потом, по какой либо причине, возвращается назад в корзину, через кнопку "Назад" браузера, Експлоер опять отправляет POST запрос, но перед этим спрашивает. "Страница устарела. Отправить снова данные или нет?". все бы ничего, но этот вопрос бесючий... К стати, моежет его можно отключить как-нибудь средствами PHP?

   
 
 автор: Unkind   (31.10.2006 в 21:59)   письмо автору
 
   для: tAleks   (31.10.2006 в 21:45)
 

А...Пользуйтесь Opera ;)
А так ничего сделать нельзя с этим сообщением...

   
 
 автор: tAleks   (31.10.2006 в 22:40)   письмо автору
 
   для: Unkind   (31.10.2006 в 21:59)
 

>А...Пользуйтесь Opera ;)

ага... и на главной странице большими буквами предупредить юзеров о том, чтобы пользовались Оперой....

>А так ничего сделать нельзя с этим сообщением...

Я я нашел способ.... :)

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


<?
// После обработчика
if(isset($_POST['Submit'])) header("Location: ".$_SERVER['PHP_SELF']);
?>

   
 
 автор: Unkind   (31.10.2006 в 23:28)   письмо автору
 
   для: tAleks   (31.10.2006 в 22:40)
 

ага... и на главной странице большими буквами предупредить юзеров о том, чтобы пользовались Оперой....
Дык может посетителей это сообщение только радует :)))

Я я нашел способ.... :)
Ну во-первых...Пользователь, нажав на "Подсчитать", например, никакого результата не увидит, так как его обратно перекинет на эту же страницу. Только если в cookies запихнуть это действие...
Во-вторых,

QUOTE
Если делает подсчет в корзине, потом переходит дальше, и потом, по какой либо причине, возвращается назад в корзину ...

Куда же он "дальше" зашел?) И зачем ему в данном случае назад нажимать?

   
 
 автор: tAleks   (01.11.2006 в 08:08)   письмо автору
 
   для: Unkind   (31.10.2006 в 23:28)
 

>Ну во-первых...Пользователь, нажав на "Подсчитать", например, никакого результата не увидит, так как его обратно перекинет на эту же страницу. Только если в cookies запихнуть это действие...

Как это не увидит? Увидит! У меня в начале файла обработчик, а далее HTML. Между обработчиком и html стоит строка:

if(isset($_POST['action'])) { header("Location: ".$_SERVER['PHP_SELF']); exit; }


У меня все считается.....

>Во-вторых,
>Если делает подсчет в корзине, потом переходит дальше, и потом, по какой либо причине, возвращается назад в корзину ...
>Куда же он "дальше" зашел?) И зачем ему в данном случае назад нажимать?

Дальше он идет на страницу с выбором варианта оплаты.... а обратно он может пойти... ну по разным причинам... откуда я знаю что ему в головоу сбредет... может захочет купить 3 товара за место 2-х... и решит вернуться .... ;)

   
 
 автор: zavragnov   (31.10.2006 в 20:02)   письмо автору
 
   для: tAleks   (31.10.2006 в 19:04)
 

Я ставлю куку на на 30 секунд да в принципе на солько душе угодно, и проверяю ее

   
Rambler's Top100
вверх

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