У меня есть простая форма, которая отправляет текст в мою таблицу SQL. Проблема в том, что после того, как пользователь отправит текст, он может обновить страницу, и данные будут отправлены снова без повторного заполнения формы. Я мог бы перенаправить пользователя на другую страницу после отправки текста, но я хочу, чтобы пользователи оставались на той же странице.
Я помню, как читал что-то о предоставлении каждому пользователю уникального идентификатора сеанса и сравнении его с другим значением, которое решило мою проблему, но я забыл, где он находится.
POST
POST
данных. В этом случае вам нужноSELECT
это из БД. Например, когда вы создаете счет-фактуру, вы будете перенаправлены на/invoices/53
Ответы:
Используйте шаблон Post / Redirect / Get. http://en.wikipedia.org/wiki/Post/Redirect/Get
На своем веб-сайте я буду хранить сообщение в файле cookie или сеансе, перенаправлять после публикации, читать cookie / сеанс, а затем очищать значение этого сеанса или переменной cookie.
источник
Я также хотел бы отметить, что вы можете использовать подход javascript,
window.history.replaceState
чтобы предотвратить повторную отправку при нажатии кнопки обновления и возврата.Доказательство концепции здесь: https://dtbaker.net/files/prevent-post-resubmit.php
Я бы по-прежнему рекомендовал подход Post / Redirect / Get, но это новое JS-решение.
источник
Вам действительно следует использовать шаблон Post Redirect Get для обработки этого, но если вы каким-то образом оказались в положении, в котором PRG нежизнеспособен (например, сама форма находится во включении, предотвращая перенаправления), вы можете хешировать некоторые параметры запроса чтобы создать строку на основе содержимого, а затем проверить, что вы ее еще не отправили.
источник
session_start();
в начало файла. w3schools.com/php/php_sessions.asp говорит : Примечание. Функция session_start () должна быть самой первой в вашем документе. Перед любыми HTML-тегами.Я использую эту строку javascript, чтобы заблокировать всплывающее окно с запросом на повторную отправку формы при обновлении после отправки формы.
Просто поместите эту строку в нижний колонтитул вашего файла и увидите волшебство
источник
Вы можете предотвратить повторную отправку формы с помощью переменной сеанса.
Сначала вы должны установить
rand()
в текстовом поле и$_SESSION['rand']
на странице формы:После этого проверьте значение
$_SESSION['rand']
текстового поля$_POST['randcheck']
следующим образом:источник
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />
вместо$_POST
данных формы та же страница перезагружается, повторно устанавливая переменные сеанса и публикации. Также создание переменных должно происходить после проверки совпадения переменных. Поэтомуunset
не нужен.Когда форма обрабатывается, вы перенаправляетесь на другую страницу:
вы также можете перенаправить на ту же страницу.
если вы делаете что-то вроде комментариев и хотите, чтобы пользователь оставался на той же странице, вы можете использовать Ajax для обработки отправки формы
источник
Я нашел следующий обходной путь. Вы можете избежать перенаправления после обработки
POST
запроса, манипулируяhistory
объектом.Итак, у вас есть HTML-форма:
Когда вы обрабатываете эту форму на своем сервере, вы вместо того, чтобы перенаправлять пользователя
/the/result/page
, настраиваяLocation
заголовок следующим образом:После обработки
POST
редактируемых данных вы визуализируете небольшой размер,<script>
и результат/the/result/page
<script>
Вы должны оказывать:Результат:
как вы можете видеть, данные формы
POST
редактируются вprocess.php
скрипт.Этот скрипт обрабатывает
POST
данные и рендеринг/the/result/page
сразу с помощью:POST
данных при обновлении страницы (F5)POST
при переходе на предыдущую / следующую страницу через историю браузераUPD
В качестве другого решения я прошу команду Mozilla FireFox запросить функцию, чтобы пользователи могли настроить заголовок, который будет работать как заголовок и сделать шаблон устаревшим.
NextPage
Location
post/redirect/get
Коротко. Когда сервер обрабатывает
POST
данные формы успешно, он:NextPage
Заголовок установки вместоLocation
POST
данных формы, как он будет отображаться дляGET
запроса вpost/redirect/get
шаблонеБраузер, в свою очередь, увидит
NextPage
заголовок:window.location
соNextPage
значениемGET
запросNextPage
вместо преобразованияPOST
данных.Я думаю, это было бы здорово, если бы это было реализовано, не так ли?
=)
источник
Используйте заголовок и перенаправьте страницу.
header("Location:your_page.php");
Вы можете перенаправить на ту же или другую страницу.Отключите $ _POST после его вставки в базу данных.
unset($_POST);
источник
unset
? Пожалуйста, добавьте пояснения к своему ответу, чтобы другие могли извлечь из него урокиСамый верный способ - добавить уникальный идентификатор в сообщение и кэшировать его в
Затем в вашем коде сделайте это:
источник
Этот метод мне подходит, и я думаю, что это самый простой способ выполнить эту работу.
Общая идея состоит в том, чтобы перенаправить пользователя на некоторые другие страницы после отправки формы, что остановит повторную отправку формы при обновлении страницы. Тем не менее, если вам нужно удерживать пользователя на той же странице после отправки формы, вы можете сделать это несколькими способами, но здесь я описываю метод javascript.
Метод Javascript
Этот метод довольно прост и блокирует всплывающее окно с запросом на повторную отправку формы при обновлении после отправки формы. Просто поместите эту строку кода javascript в нижний колонтитул вашего файла и увидите волшебство.
источник
Javascript
Этот метод довольно прост и блокирует всплывающее окно с запросом на повторную отправку формы при обновлении после отправки формы. Просто поместите эту строку кода javascript в нижний колонтитул вашего файла и увидите волшебство.
источник
Просто перенаправьте его на ту же страницу после использования данных формы, и он работает. Я пробовал.
источник
Доработанная версия поста Моба. Создайте хэш POST, сохраните его как файл cookie сеанса и сравнивайте хеши в каждом сеансе.
источник
По сути, вам нужно перенаправить с этой страницы, но это все еще может создать проблему, пока ваш интернет медленный (заголовок перенаправления со стороны сервера)
Пример базового сценария:
Дважды нажмите кнопку отправки
Способ решения
Сторона клиента
Сторона сервера
источник
Как предотвратить повторную отправку формы php без перенаправления. Если вы используете $ _SESSION (после session_start) и форму $ _POST, вы можете сделать что-то вроде этого:
В вашей html-форме поместите это:
Таким образом, каждый раз, когда форма отправляется, создается новый акт, который сохраняется в сеансе и сравнивается с почтовым актом.
Ps: если вы используете форму Get, вы можете легко изменить все POST с помощью GET, и это тоже работает.
источник
После вставки в базу данных вызовите метод unset () для очистки данных.
снята с охраны ($ _ POST);
Чтобы предотвратить вставку обновленных данных, выполните перенаправление страницы на ту же или другую страницу после вставки записи.
Заголовок ( 'Location:' $ _ SERVER [ 'PHP_SELF'].);
источник
unset
нужен этот звонок? Что будет, если вы его пропустите?Использование шаблона Post / Redirect / Get из ответа Keverw - хорошая идея. Однако вы не можете оставаться на своей странице (и я думаю, это было то, о чем вы просили?) Кроме того, иногда это может дать сбой :
Другой вариант - сохранить в сеансе, если текст должен быть записан в вашу базу данных SQL следующим образом:
источник
Как говорили другие, невозможно отказаться от использования post / redirect / get. Но в то же время довольно легко делать то, что вы хотите, на стороне сервера.
На странице POST вы просто проверяете ввод пользователя, но не выполняете никаких действий, вместо этого вы копируете его в массив SESSION. Затем вы снова перенаправляете обратно на главную страницу отправки. Ваша основная страница отправки начинается с проверки, существует ли массив SESSION, который вы используете, и, если да, скопируйте его в локальный массив и отключите его. Оттуда вы можете действовать.
Таким образом, вы выполняете всю свою основную работу только один раз, достигая того, чего хотите.
источник
После этого я искал решение, чтобы предотвратить повторную отправку в огромный проект. Код отлично работает с $ _GET и $ _POST, и я не могу изменить поведение элементов формы без риска непредвиденных ошибок. Итак, вот мой код:
Это работает только для предотвращения повторной отправки $ _POST, а не $ _GET. Но это то поведение, которое мне нужно. Проблема с повторной отправкой не работает с загрузкой файлов!
источник
Что мне подходит:
И в твоей форме
источник
В этом
form.php
примере показано, как правильно использовать PRG (когда форма действительна или нет).источник
источник
$everything_fine
взялось?Почему бы просто не использовать
$_POST['submit']
переменную как логический оператор, чтобы сохранить все, что находится в форме. Вы всегда можете перенаправлять на ту же страницу (в случае , если они освежат, и когда они попалиgo back
в браузере, то отправить сообщение переменный не будет установлены больше. Просто убедитесь , что кнопка отправить имеетname
иid
изsubmit
.источник