Как остановить повторную отправку формы при обновлении страницы
9 ответ
- голосов
-
- 2013-04-20
Вместо…
} else { echo "<p>Your file has been uploaded.</p>"; }
… в случае успеха перенаправить на другой адрес:
} else { $new_url = add_query_arg( 'success', 1, get_permalink() ); wp_redirect( $new_url, 303 ); exit; }
Код состояния 303 запускает запрос GET :
<цитата>Этот метод существует прежде всего для того,чтобы разрешить вывод активированного POST сценария перенаправить пользовательский агент на выбранный ресурс. Новый URI не заменяет собой ссылку на первоначально запрошенный ресурс. Ответ 303 НЕ ДОЛЖЕН кэшироваться,но ответ на второй (перенаправленный) запрос может быть кэшируемым.
В обработчике формы сначала проверьте,установлен ли
$_GET['success']
и его значение равно1
,затем распечатайте сообщение об успешном завершении. Посетитель может перезагружать эту страницу снова и снова - и ничего не будет отправлено.Instead of …
} else { echo "<p>Your file has been uploaded.</p>"; }
… redirect to another address on success:
} else { $new_url = add_query_arg( 'success', 1, get_permalink() ); wp_redirect( $new_url, 303 ); exit; }
Status code 303 triggers a GET request:
This method exists primarily to allow the output of a POST-activated script to redirect the user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource. The 303 response MUST NOT be cached, but the response to the second (redirected) request might be cacheable.
In your form handler check first if
$_GET['success']
is set and its value is1
, then print a success message. The visitor can reload this page again and again – and nothing will be sent.-
К сожалению,это не сработало,и я понятия не имею,почему,потому что этотphp действительно торчит (просто чтобы подтвердить,что все,что я должен был сделать,это заменить эхо?Unfortunately that didn't work, and I have no idea why because that php does stick up (just to confirm all I was supposed to do was replace the echo?
- 0
- 2013-04-20
- ameeromar
-
Вы должны отправить заголовок до того,как какой-либо вывод будет отправлен в браузер.You have to send the header before any output has been sent to the browser.
- 1
- 2013-04-20
- fuxia
-
так поместите бит кодаphp в заголовок?so put the php code bit in the header?
- 0
- 2013-04-26
- ameeromar
-
@ameeromar Да.Вся обработка данных должна выполняться до того,как вы начнете создавать выходные данные.@ameeromar Yes. All data processing should be done before you start creating output.
- 2
- 2013-04-26
- fuxia
-
- 2013-09-11
У меня была такая же проблема,и она была «осложнена» тем,что я перенаправлял все URL-адреса в один файл .php.Оказалось,что все,что мне нужно было сделать,чтобы решить эту проблему,- это вставить следующий фрагмент кода до того,как любой html будет записан на страницу.
<?php if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI'])) { [process the post data in 'mypostvar'] header ('Location: ' . $_SERVER['REQUEST_URI']); exit(); } ?>
Это приведет к перенаправлению на ту же страницу после того,как постданные будут обработаны так,как вы этого хотите. После перенаправления исходные постданные исчезают и не запускают повторную отправку. Функция header () будет работать только в том случае,если вы вставите ее до того,как что-либо будет записано на страницу. exit () необходим.
Перед размещением заголовка () необходимо обработать данные публикации.
I had the same problem and it was "complicated" by the fact that I redirect all URLs to a single .php file. It turned out all I had to do to solve it was to insert the following piece of code before any html is written to the page.
<?php if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI'])) { [process the post data in 'mypostvar'] header ('Location: ' . $_SERVER['REQUEST_URI']); exit(); } ?>
This will redirect to the same page after the postdata is processed as you want it. After the redirect the original postdata is vanished and will not trigger the resubmit. The function 'header()' will only work if you insert it before anything is written to the page. exit() is necessary.
You have to process the post data before you place the header().
-
- 2018-05-11
По сути,общая идея состоит в том,чтобы перенаправить пользователя на некоторые другие страницы после отправки формы,что остановило бы повторную отправку формы при обновлении страницы,но если вам нужно удерживать пользователя на той же странице после отправки формы,вы можете сделать это разными способами.
Неустановленные данные формы
Один из способов остановить повторную отправку страницы при обновлении страницы - это отключить данные формы после их отправки,чтобы переменная,хранящая данные формы,стала пустой,и завершить блок кодов обработки формы,чтобы проверить,пуста ли форма.
if (!empty ($ _ POST) && $ _SERVER ['REQUEST_METHOD']=='POST') { $ data=//здесь обрабатываются коды сбросить $ data; }
Это сделает $ data пустым после обработки,а первое предложение остановит повторную отправку формы при обновлении страницы.
<▪Javascript
Этот метод довольно прост и блокирует всплывающее окно с запросом на повторную отправку формы при обновлении после отправки формы. Просто поместите эту строку кодаjavascript в нижний колонтитул файла и увидите волшебство.
& lt; скрипт > if (window.history.replaceState) { window.history.replaceState (ноль,ноль,window.location.href); } & lt;/script >
Basically, the general idea is to redirect the user to some other pages after the form submission which would stop the form resubmission on page refresh but if you need to hold the user in the same page after the form is submitted, you can do it in multiple ways.
Unset Form Data
One way to stop page resubmission on page refresh is to unset the form data after it is submitted so that the variable storing form data becomes empty and wrap up your form processing block of codes to check if the form is empty.
if(!empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST'){ $data = // processing codes here unset $data; }
This will make $data empty after processing and the first clause would stop form resubmission on page refresh.
Javascript
This method is quite easy and blocks the pop up asking for form resubmission on refresh once the form is submitted. Just place this line of javascript code at the footer of your file and see the magic.
<script> if ( window.history.replaceState ) { window.history.replaceState( null, null, window.location.href ); } </script>
-
- 2013-09-12
Я решил эту проблему с помощью действияtemplate_redirect (либо в плагине,либо в файлеfunctions.php вашей темы).
add_action('template_redirect','myfunction') ; function myfunction() { global $post; $post_id = $post->ID; if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) { require_once(ABSPATH . 'wp-admin/includes/admin.php'); $id = media_handle_upload('async-upload', $post_id); //post id of Client Files page unset($_FILES); if ( is_wp_error($id) ) { $errors['upload_error'] = $id; $id = false; } } $error = ($errors) ? 1 : 0; wp_redirect( "/?p={$post_id}?errors={$error}",301); }
Затем на своей странице вы можете проверить наличие ошибок
if ($_GET['errors']) { echo "<p>There was an error uploading your file.</p>"; } else { echo "<p>Your file has been uploaded.</p>"; }
(Я не тестировал этот код ... он должен дать вам хорошую отправную точку).
I solved this my using the template_redirect action (either in a a plugin or on your themes functions.php file).
add_action('template_redirect','myfunction') ; function myfunction() { global $post; $post_id = $post->ID; if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) { require_once(ABSPATH . 'wp-admin/includes/admin.php'); $id = media_handle_upload('async-upload', $post_id); //post id of Client Files page unset($_FILES); if ( is_wp_error($id) ) { $errors['upload_error'] = $id; $id = false; } } $error = ($errors) ? 1 : 0; wp_redirect( "/?p={$post_id}?errors={$error}",301); }
Then on your page you can check for errors
if ($_GET['errors']) { echo "<p>There was an error uploading your file.</p>"; } else { echo "<p>Your file has been uploaded.</p>"; }
(I've not tested this code.. it should give you a good starting point).
-
С `global $post` в первой строке шансы,что эта функция работает,увеличиваются ...With `global $post` in first line, chances this function works will increase...
- 1
- 2013-09-12
- gmazzap
-
- 2013-09-12
Вы также можете проверить
$_SERVER['REQUEST_METHOD'] === 'POST'
,чтобы убедиться,что страница была обновлена с помощью POST перед обработкой формы.if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { // Do Stuff }
You can also test for
$_SERVER['REQUEST_METHOD'] === 'POST'
to make sure that the page has been refreshed via POST before processing the form.if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { // Do Stuff }
-
- 2016-01-09
более простой способ - удалить действие из формы и создать скрытое действие,например:
<html> <form action="" method="post><input type="text" name="name" /> <input type="submit" value="Submit" /> <input type="hidden" name="action" value="Submit" /> </form> </html>
пусть ваш контроллер проверяет действительность и отправку,чтобы проверить,была ли отправлена форма:
<?php if (isset($_POST['action']) && $_POST['action'] == 'Submit'){ //you should add code to validate user input here //if all ok submit the form header('Location: .'); //redirects to the controller without resubmitting } ?>
этот метод очень полезен для скриптов,в которых вы добавляете или удаляете записи на странице администратора,поскольку он перезагружает страницу без повторной отправки,а удаленная или добавленная запись будет либо удалена,либо добавлена на страницу :)
an easier way is to remove the action from your form and have a hidden action so for example:
<html> <form action="" method="post><input type="text" name="name" /> <input type="submit" value="Submit" /> <input type="hidden" name="action" value="Submit" /> </form> </html>
have your controller checking for validity and for submissions so to check if the form was submitted:
<?php if (isset($_POST['action']) && $_POST['action'] == 'Submit'){ //you should add code to validate user input here //if all ok submit the form header('Location: .'); //redirects to the controller without resubmitting } ?>
this method is very useful for scripts where you are adding or removing records on an admin page as it would reload the page without resubmitting and the record removed or added would be either removed or added to the page :)
-
- 2017-06-23
Лучший метод,который я нашел,- это использованиеjavascript и css.Заголовок обычного метода перенаправленияphp ('Location: http://www.yourdomain.com/url );будет работать,но это вызовет предупреждение «Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены» в разных фреймворках и cms,таких как wordpress,drupal и т. д. Поэтому я предлагаю следовать приведенному ниже коду
echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit;
Тег стиля важен,иначе пользователю может показаться,что страница загружается дважды.Если мы используем тег стиля без отображения тела,а затем обновим страницу,то взаимодействие с пользователем будет таким же,как и в заголовкеphp ('Location: ....);
Надеюсь,это поможет :)
The best method I found is using javascript and css. Common php redirection method header('Location: http://www.yourdomain.com/url); will work but It cause warning " Warning: Cannot modify header information - headers already sent" in different frameworks and cms like wordpress, drupal etc. So my suggestion is to follow the below code
echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit;
The style tag is important otherwise the user may feel like page loaded twice. If we use style tag with body display none and then refresh the page , then the user experience will be like same as php header('Location: ....);
I hope this will help :)
-
- 2020-04-30
Решение 1: Если вы вставляете сообщение в тип сообщения,просто сгенерируйте случайный код с помощью функцииphp
rand()
и сохраните код при вставке сообщения.Также установите тот же код в переменной$_POST['uniqueid']
.Затем проверьте при вставке,присутствует ли текущий уникальный идентификатор в сообщениях или нет,вы можете сделать то же самое с помощью
wp_query()
.Решение 2: Перенаправить на другую страницу с помощьюjavascript.Но,пожалуйста,не тот пользователь может вернуться на страницу и снова сохранить сообщение при обновлении.Для этой проблемы лучше всего подходит первое решение.
Решение 3: Используйте ajax для вставки поста,таких проблем не будет.Но если хотите хитов.Это плохая идея,может быть,для Google AdSense.
Я просто пытался помочь своим опытом.Если кому-то понадобится код для решения проблемы,просто спросите,я поделюсь.
Solution 1 : If you are inserting post in post type then just generate the random code using
rand()
php function and save the code while inserting post. Also set the same code in$_POST['uniqueid']
variable.Then check on insert if the the current uniqueid is there in posts or not, you can do the same using
wp_query()
.Solution 2 : Redirect to another page using javascript. But kindly not that user can go back to page and on again it will save post on refresh. For this issue the first solution is best.
Solution 3 : Use ajax to insert post there will be no issues like this. But if you want page hits. It's not a good idea, may be for Google Adsense.
I just tried to help by my experience. If anyone need code to fix the problem, simply ask, I will share.
-
- 2014-12-07
простой и легкий способ сделать это вphp. пример здесь:
не забывайте теги html (эта форма не разрешает это здесь,поэтому я использую [this])
$firstname = $post[firstname] $lastname = $post[lastname] [form action="here.php" method="post"] first name[input type='firstname' name='firstname'] last name[input type='text' name='lastname'] [input type=submit value=submit] [/form] if($firstname==""||$lastname=="") { echo"the firstname and lastname are empty"; } else { mysql_query("YOUR DATABASE INSERT HERE"); header("Location:here.php"); }
вот как предотвратить публикацию одних и тех же данных дважды при обновлении страницы при вводе данных в базу данных
the simple and easy way to do this in php. example here:
dont forget the html tags(this form wont allow it here so i use [this])
$firstname = $post[firstname] $lastname = $post[lastname] [form action="here.php" method="post"] first name[input type='firstname' name='firstname'] last name[input type='text' name='lastname'] [input type=submit value=submit] [/form] if($firstname==""||$lastname=="") { echo"the firstname and lastname are empty"; } else { mysql_query("YOUR DATABASE INSERT HERE"); header("Location:here.php"); }
this is how to keep the data enter in the database from posting the same data twice on page refresh
Привет,у меня есть форма,которая добавляет вложения к сообщению,однако,когда форма публикует сообщения,она явно не показывает сообщение с новым вложением,повторяющим «ваш файл был загружен». Когда пользователь обновляет страницу (чтобы попытаться показать свое новое вложение),форма снова отправляет сообщение!
Можно ли (1) снова остановить публикацию формы при обновлении,(2) автоматически обновить страницу для отображения сообщения с новым вложением? (2 лучше)
Спасибо! :)