Как автоматически обновить страницу после отправки формы
У меня есть HTML-форма, где, когда я нажимаю "обновить", изменения не отражаются, и для их просмотра требуется обновление. Но когда я перезагружаюсь, всегда есть Confirm Form Resubmission
,
я использовал <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
что означает, что он отправляет на той же странице.
4 ответа
Вы можете обновить страницу несколькими способами:
Путь: 1
if(isset($_POST[submits])) {
header("location:index.php"); // your current page
}
Путь: 2
if(isset($_POST['submit'])) {
//Your SQL Query
echo "<meta http-equiv='refresh' content='0'>";
}
Способ: 3 (не рекомендуется)
onsubmit="window.location.reload();"
кажется, это не работает. Так что я использую функцию тайм-аута в нем. Чтобы это работало.
onsubmit="setTimeout(function() { window.location.reload(); }, 5)"
Путь: 4
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Поэтому основная проблема, которую вы описываете, заключается в том, что методом запроса url является POST. Если вы обновите страницу после отправки формы, браузер попытается снова выполнить POST, как если бы вы нажали кнопку отправки.
На самом деле это очень естественный способ отправки данных (на URL, на котором создается форма). Большинство CMS с открытым исходным кодом будут делать то же самое и вести себя одинаково (wordpress, drupal).
Я создал пользовательскую систему, которая выполняла ту же функцию, но у меня были некоторые жалобы на обновление, вызывающее "Вы уверены, что хотите снова отправить эту форму" вместо простой перезагрузки формы. Поэтому я решаю проблему с помощью решения @Bruce s. Внизу моей страницы, прежде чем что-либо выводить, я делаю перенаправление на текущий URL. Это изменяет предыдущую страницу в глазах обозревателя на GET вместо POST и предотвращает предупреждение повторной отправки.
Что касается ваших данных, которые не обновляются, вы, вероятно, создаете форму перед обработкой сообщения. Убедитесь, что обработка сообщения является первой выполняемой вами операцией.
Моя система сильно отличается от этого примера кода, поэтому не ожидайте, что это сработает из коробки. Но это должно дать вам правильную идею.
<?php
if (isset($_SERVER["REQUEST_METHOD"]) && ($_SERVER["REQUEST_METHOD"] == "POST"))
{
// Validate my form.
if ($valid)
{
// Save data on successful validation.
// Redirect to prevent refresh from triggering another
// form submission. Optional but helpful.
redirect($_SERVER['REQUEST_URI']);
}
else
{
// Not valid no harm in just reloading as the user will be
// fixing their errors and resubmitting anyway.
// Generate error messages, etc.
}
}
// Retrieve your form values here after you have fully processed the POST
// operation.
$values = getDBValues();
function redirect($path)
{
// The path should be validated somehow as the user
// could alter parts of it such as query parameters.
// For simplicity I'm leaving that part out.
header('Location: ' . $path);
die();
}
?>
<html>
<form>
...
Ваша страница уже обновляется после "обновления", потому что Confirm Form Resubmission
оповещение всплывает. Я предполагаю, что проблема в том, что в php-скрипте вы отображаете данные перед обработкой новых данных Post.
Я склонен использовать представления формы AJAX:
// Bind the submit action
$('#myForm').submit(mySubmitFunction);
// Submit handler
function mySubmitFunction(e) {
e.preventDefault();
var form = $(this);
$.ajax({
url: form.attr('action'),
data: form.serialize()
}).done(function(xhr) {
// My endpoint returns JSON output
var responseJSON = false;
try {
responseJSON = $.parseJSON(xhr);
} catch (error) {}
if (responseJSON && responseJSON.hasOwnProperty('result') &&
responseJSON.result) {
// The important bit
location.reload();
} else {
// Handle error
}
});
}
Я выбрал это для того, чтобы иметь возможность быстро предоставить пользователю обратную связь. Если вы не хотите использовать AJAX, достаточно простого заголовка ('Location: yourPage.php') в PHP-файле, обрабатывающем вашу форму.