Предотвратить повторную отправку формы php

Как запретить повторную отправку формы?

Есть функция, которая выводит форму для добавления фото в каталог с выводом на экран. Беда в том, что если после добавления фото обновить страницу, то фотография добавиться еще раз, и еще и еще, потому что каждый раз отправляется форма. Как это пресечь?

Делайте редирект на данную страницу сразу после заливки видео) и тогда обновление не будет приводить к повторной отправке формы

Спасибо, будем разбираться. А вот еще вопросик. На странице, допустим mysite.php?view=main&id=12 есть ссылка Как в ней прописать href, чтобы она ссылалась на эту же страницу с этими же параметрами view=main&id=12? Пробовал $_SERVER[PHP_SELF] и т.д., но при этом теряются все параметры адресной строки

возможные параметры известны? добавтье их в ручную if(isset($_GET[‘id’])) $url.=»&id=».$_GET[‘id’]//и т.д.

в пхп адреса с параметрами $url собираете с $_SERVER-a,(REQUEST_URI,QUERY_STRING,etc) , потом перенаправляете с header(«Location: $url»); Правда, если до этой строчки есть выводимое контент, то буферизуйте.

3 ответа 3

Есть старый добрый костыль — уникальный ключ в каждой форме.

Как это работает. В каждой генеренной форме есть поле типа

if ($_POST['token'] == $_SESSION['lastToken']) < вывод сообщения об ошибке >else

Решение немного корявое, но задача не настолько требовательна, чтоб нужно было больше.

Да с самого начала. >if ($_POST[‘token’] == $_SESSION[‘lastToken’]) **Что если POST вообще не отправляли?** > if ( isset($_POST[‘token’])) // тогда возможно

Ваш вариант if ($_POST[‘token’] == $_SESSION[‘lastToken’]) < вывод сообщения об ошибке >Верный вариант if ($_POST[‘token’] == $_SESSION[‘lastToken’]) < Обработка кода >Для наглядности не добавлял проверку на установленность токена, да и без нее пхп ошибки выдать не должен(хотя не уверен), но работать будет не корректно.

Про проверку на наличие поля в запросе — согласен — это не корректно. Хотя именно в данном случае оно отработает и без него. Насчет условия — все верно — ошибкой является только наличие двух одинаковых ключей в ПОСТах подряд. Мы говорим о защите от случайного повторного клика. Это в неумелых руках гораздо надежнее, чем полноценная защита от левых запросов — генерировать соль, писать в сессию, потом сверять её, а потом начинает не сходится))

Источник

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

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

Мне часто задают вопросы относительно отмены повторной отправки формы. Например, Вы сделали форму добавления комментария, добавили обработчик на эту же страницу. Затем при добавлении комментария он успешно добавляется, но стоит пользователю нажать F5, как форма будет отправлена ещё раз. А F5 пользователь может легко нажать, если страница будет долго грузиться. В итоге, вместо 1-го комментария будет целых 2, а то и больше. В этой статье я покажу, как этого можно избежать.

Для начала разберём более подробно проблему на примере этого кода:

Нажав на кнопку «Возвести в квадрат«, Вы увидите результат работы скрипта. Но стоит после этого пользователю нажать F5, как скрипт снова будет выполняться. В данном случае, это не так критично, как с добавлением комментарием, однако, зачем нужна лишняя нагрузка на сервер?

Теперь поговорим о способах решения данной проблемы. Первый способ — выделить скрипт обработки в отдельный файл. Тогда в атрибуте action у тега form надо добавить путь к этому скрипту. А сам скрипт должен сохранять куда-нибудь результат своих действий, либо переменные пришедшие на скрипт, а после делать редирект обратно. В общем, смотрите код скрипта:

session_start();
$_SESSION[«x»] = $_POST[«x»];
header(«Location: «.$_SERVER[«HTTP_REFERER»]);
exit;
?>

А код страницы с формой теперь будет выглядеть так:

Недостаток этого подхода очевиден — приходится создавать ещё один файл для такого простого скрипта. Поэтому рассказываю и про второй способ, как можно избежать повторной отправки формы:

Здесь обработка снова происходит в этом же файле, но ключевое отличие — это наличие редиректа на эту же страницу в конце. В результате, страница перегрузится после отправки формы и браузер при нажатии F5 не будет предлагать пользователю отправить форму ещё раз.

Подведу итог того, как отменить повторную отправку формы:

  • Либо делать обработку в отдельном файле, а затем оттуда делать редирект назад.
  • Либо делать обработку в том же файле, что и форма, но при этом после обработки делать редирект на ту же страницу.

Вот так это делается в простых скриптах. Да и, в сложных, в конечном счёте делается то же самое.

Создано 04.11.2013 21:55:05

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 12 ):

    Или написать в форме action=».»

    все это конечно понятно. Тоже хотел использовать способ на подобии, но у меня форма очень большая. Актуально ли писать значения формы из 57 полей в $_SESSION ?

    При таком примере писать придется. Редирект убьет все POSTы

    это и так понятно. Мой вопрос стоял актуально ли записывать такое значение полей 57 в $_SESSION

    А почему нет? foreach($_POST as $k => $v) $_SESSION[$k] => $v;

    А я делал по проще: в форму добавил скрытый input, в котором храниться случайное число генерирующееся php. А также при генерации оно забивается в сессии. Затем при принятии формы сначала проверяется совпадение числа, и если нет совпадения форма не обрабатывается. Это как скрытая капча, которая сама вводиться

    Я сделал так: if (isset($_POST[‘knopka’]))

    А меня интересует совсем противоположный вопрос! А как зделать чтоб отправка формы продублировалясь три раза с интервалом в секунду! Какой обрабочик нужно добавить в код?

    Здравствуйте. Не очень понял как делать. Изучаю Ваш курс основы PHP. Перепроверил код, но все равно при обновлении страницы комментарий дублируется. А у Вас на видео все нормально, без всяких редиректов. Вот сам код:

    Добавить запись

    Имя:
    Комментарий:

    Записи в гостевой книге:

    > $comments = getAllGuestBookComments(); for ($i = 0; $i < count($comments); $i++) < $name = $comments[$i]["name"]; $comment = $comments[$i]["comment"]; include "blocks/guestbook_comment.php"; >?>

    Добрый день. У меня не получается предотвратить повторную отправку. Выходят ошибки. Warning: session_start(): Cannot send session cookie — headers already sent by (output started at D:\webServer\OpenServer\domains\sample.local\index.php:3) in D:\webServer\OpenServer\domains\sample.local\index.php on line 30 Warning: session_start(): Cannot send session cache limiter — headers already sent (output started at D:\webServer\OpenServer\domains\sample.local\index.php:3) in D:\webServer\OpenServer\domains\sample.local\index.php on line 30 Warning: Cannot modify header information — headers already sent by (output started at D:\webServer\OpenServer\domains\sample.local\index.php:3) in D:\webServer\OpenServer\domains\sample.local\index.php on line 182

    Я конечно извиняюсь, но вы сами то запускали, тестили свои скрипты, во первых после нажатия и отправки запроса белый экран, результаты почему то выводятся в консоле, а во вторых это не работает, т.к. при обновлении данные отправляются повторно. Только что проверил!

    В статью необходимо сделать важное дополнение о том, что в основном файле сайта (index.php) после вывода результатов обработки формы необходимо обязательно закрыть сессию командой session_destroy(); , иначе скрипт обработки формы будет всегда выводить один и тот же результат вне зависимости от значений введенных в форму, т.к. он использует данные из сессии, а не из формы. Проверено на собственном скрипте.

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Как отправить форму в php, чтобы она не отправлялась повторно, после обновления страницы

    Сегодня тема пойдет об отправке формы на html-страничке, чтобы, при повторном обновлении, она не отправлялась заново в БД.

    Не знаю, было ли такое где-то на просторах интернета, но, когда я попыталась найти, а мне было жутко это нужно, причем очень срочно, то я столкнулась с кучей проблем.

    Во первых, почти все источники предлагают делать это таким образом:

    Но, проблема в нем следующая, если вы, уже где то в начале страницы отправили заголовки, то на вас будут ругаться, мол, «заголовки отправлены, зачем ты хочешь, чтобы я это сделал еще один раз, угомонись!»

    1. обнулить форму
    2. засунуть все переменные формы в переменную $_SESSION(нам нужно больше переменных сессии!)

    Но данные способы были неудобны, возможно, вам покажется, что это наоборот, самый лучший вариант и зачем изобретать велосипед?

    Меня же, все способы, встретившиеся на просторах интернета, не устроили. И я решила сделать то, что будет удобно мне и не будет занимать большое количество переменных/времени/ресурсов.
    Приступим.

    Для начала, создадим простенькую форму.

    Затем добавим в форму метод отправки, действие и имя:
    Действие будет происходить на другой странице, для удобства и дальнейшей функциональности.

    Затем, мы создаем файлик redir.php и работаем над ним:

     /*redir.php*/ alert("Заполните все поля формы");'; > else < $name = $_POST["name"]; $phone = $_POST["phone"]; $datetime= date("l dS of F Y h:i:s A"); $mysqly=mysqli_query($connect,"INSERT INTO contacts VALUES ('','$name','$phone','$datetime','')") OR DIE (MYSQLI_ERROR());>> ?>  

    Все. Как видите это просто, быстро и удобно!

    Надеюсь, вам пригодится данная статья.

    Буду рада критике или вашим предложениям.

    P.S. Да, можно сделать отправку заголовка на этой, дополнительной, странице, но, почему-то с использованием кода JS мне нравится больше.

    P.P.S. Спасибо за ваше внимание.

    Источник

    Как избежать повторной отправки формы при обновлении?

    Дело в том, что после отправки пост запроса скрипт принимает отправленные данные, проверяет их на корректность (валидность, заполненность обязательных данных и т.д.) и выдает ответ – либо операция прошла успешно, либо произошла ошибка и список ошибок (например: ошибка — поле «имя» не заполнено. А на странице отправки уже в свою очередь выдается соответствующее сообщение: отправка успешна или не успешна. Так вот есть ли элегантный вариант предотвратить повторную отправку формы? Например мне пришла идея что если в javascript поймать событие обновления страницы(если такова есть отменить её и просто сделать переход по текущей ссылке. Или если можно на сервере после получении данных POST запроса удалить какие нибудь информацию о запросе может она не будет повторно отправляться так как данные удалены? А еще редирект не вариант. Так как после редиректа я не могу передать ответ скрипта. А еще махинации с дополнительным полем с уникальным значением сохраненным на сессии и дальнейшая их проверка тоже крайний вариант. Что скажете есть какие нибудь варианты?

    5 ответов 5

    Чтобы было понятно, это вопрос уровня таблицы умножения в веб-программировании. И размышления вида «делать редирект или не делать» это все равно как если бы рассуждать «дважды два равное четыре не вариант. мне нужно пять».

    После POST запроса всегда должен быть редирект. Точка. Переходим к делению в столбик.

    А еще редирект не вариант. Так как после редиректа я не могу передать ответ скрипта.

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

    Впрочем, на большинстве современных сайтов (включая и этот) отправка формы осуществляется с помощью технологии AJAX, которая не требует перезагрузки страницы.

    Источник

    Читайте также:  Кнопки в контакте html
    Оцените статью