ФорумПрограммированиеPHP для идиотов → Варианты отмены повторной обработки формы

Варианты отмены повторной обработки формы

  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 29 октября 2007 г. 2:50

    Выделено из темы фишки и мелочи PHP.
    Обсуждение поста предотвращение повторной отправки формы
    ____________________________________


    Если не против предложу свой вариант.
    Я всегда делаю именно так.
    if(isset($_POST['add_info'])) {

    if(!isset($_SESSION['added'])) {
    mysql_query("INSERT INTO …");
    $_SESSION['added'] = 1;
    }
    }

    Т.е. при каком то действии создаем переменную. При обновлени страницы переменная уже будет учитываться и код не сработает. Далее если данная функция будет еще где-то выполнятся, то просто перед выводом формы проверяем данную переменную на существованием и при положительном результате удаляем его.
    Пожалуй самый просто способо. Потому что не всегда header() прокатывает. У меня например пости никогда его нельзя использовать.
    from TRIAL with LOVE
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 3:44, спустя 53 минуты 39 секунд

    У меня например пости никогда его нельзя использовать.

    ну это смотря кто как и что от чего отделяет ;)
    все умрут, а я изумруд
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 3:50, спустя 6 минут 23 секунды

    TRIAL, header() прокатывает всегда, если его правильно приготовить :)
    Твой вариант может пойти как дополнение к переадресации.
    Кстати, а если пользователь еще один комментарий добавить захочет?
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 29 октября 2007 г. 4:49, спустя 58 минут 26 секунд

    Я же написал, что при повторном использовании формы в начале пишем условие
    if(isset($_SESSION['added'])) unset($_SESSION['added']);

    Суть в том что у меня как правило везде switch case, и перед ним идет вывод текста (мета теги и прочее) так что header() не прописать. Поэтому делаю именно так. Всё отлично работает.
    Хотя конечно header() мне самому больше нравиться.
    from TRIAL with LOVE
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 5:07, спустя 18 минут 6 секунд

    Повторное использование формы это как?
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 29 октября 2007 г. 6:52, спустя 1 час 45 минут 19 секунд


    Повторное использование формы это как?

    Это вот так

    Кстати, а если пользователь еще один комментарий добавить захочет?
    from TRIAL with LOVE
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 6:58, спустя 6 минут 15 секунд

    Запросилась страница с помощью GET — вывели форму.
    Пришел POST-запрос. Обработали (занесли в базу), вывели форму.
    Пришел еще POST-запрос. Что делать? Как определить, обновилась страница или это новый каммент?
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 29 октября 2007 г. 8:03, спустя 1 час 4 минуты 51 секунду

    Бля )))
    if(isset($_POST['add_msg'])) {

    if(!isset($_SESSION['added'])) {

    mysql_query("INSERT INTO …");
    $_SESSION['added'] = 1;
    }
    }
    else {

    if(isset($_SESSION['added'])) unset($_SESSION['added']);

    echo "<form action=script.php method=post>

    </form>";
    }

    from TRIAL with LOVE
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 8:06, спустя 2 минуты 58 секунд

    Спокойнее. Закрой глаза и досчитай до десяти.

    И что мы будем лицезреть на странице после отправки формы?
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 8:17, спустя 11 минут 1 секунду


    Суть в том что у меня как правило везде switch case, и перед ним идет вывод текста (мета теги и прочее) так что header() не прописать. Поэтому делаю именно так.


    За всей этой дискуссией об изощрениях с сессиями, я так и не понял, что все-таки мешает вынести обработку формы в отдельный скрипт?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 8:23, спустя 6 минут 7 секунд

    Ничего. Только у нас не об этом дискуссия :)
    Как это поможет отменить повторную отправку данных по F5?
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 8:26, спустя 2 минуты 8 секунд


    Как это поможет отменить повторную отправку данных по F5?


    Точно так же как в твоей статье … только попутно еще решит проблему: "перед ним идет вывод текста". :)
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 8:35, спустя 9 минут 17 секунд

    Ждем каммента Триала )
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 29 октября 2007 г. 9:29, спустя 53 минуты 44 секунды

    Ну мой способ полностью исключает возможность повторной обработки данных.
    Лицезреть можно сообещение типа - Данные успешно добавлены. Можно ссылочку вывести типа - вернуться в раздел или куда там еще.
    Тема была как отменить обработку а не что юзер увидет после выполнения этой самой обработки )))
    from TRIAL with LOVE
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 29 октября 2007 г. 9:48, спустя 19 минут 40 секунд

    header() решает все эти проблемы в корне.
    У тебя же всё слишком запутано и где-нибудь порвется.
    И все же:
    И что мы будем лицезреть на странице после отправки формы?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!