如何在提交表单后自动刷新页面

4

我有一个HTML表单,在我点击“更新”后,更改没有反映出来,需要刷新才能看到更改。 但是当我重新加载时,总会出现确认表单重新提交

我使用了<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post"> 这意味着它在同一页上提交。


3
请提供HTML表单示例,以便我们可以查看您可能出现的任何错误。 - Mike
如果您需要进行简单的刷新,您可以使用HTML元标记刷新。 - Paulius Sapragonas
htmlspecialchars不应该用于编码路径。它是用于编码输出的。 - Sverri M. Olsen
1
这里没有理由使用 $_SERVER['PHP_SELF']。特别是在使用 htmlspecialchars 的情况下。只需将 action 留空即可。这并不能回答“如何在提交表单后自动刷新页面”的问题,但是留空 action 将导致您尝试做的完全相同的事情(这是错误的)。 - Loko
4个回答

5
您可以通过多种方式刷新页面: 方式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'>";
}

方法三:(不建议使用)

onsubmit="window.location.reload();",似乎无法正常工作。因此,我在其中使用了定时函数以使其正常工作。

onsubmit="setTimeout(function() { window.location.reload(); }, 5)"

Way : 4

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

我无法确定第一个代码块应该放在哪里。 - Mark Kramer
1
那在十月份不起作用。虽然这不是你的错,但我决定完全放弃PHP。 - Mark Kramer
@siddharth,您可以使用timeout(超时)函数。例如 onsubmit="setTimeout(function(){window.location.reload();},5)"。根据您的需要增加时间,以提交表单并重新加载到页面上。我已更新了方法并添加了更多方法。 - Bruce

1
所述问题的主要问题在于URL请求方法是POST。如果您在提交表单后刷新页面,浏览器会尝试再次进行POST,就像您点击提交按钮一样。
这实际上是提交数据(到生成表单的URL)的一种非常自然的方式。大多数开源CMS也会做同样的事情并具有相同的行为(如WordPress、Drupal)。
我构建了一个自定义系统,它也做了同样的事情,但有人抱怨刷新会触发“您确定要再次提交此表单吗”的警告,而不是仅重新加载表单。所以我使用了@Bruce的解决方案来解决这个问题。在输出任何内容之前,在我的页面底部进行重定向到当前URL。这将在浏览器的眼中将上一页更改为GET而不是POST,并防止重新提交警告。
至于您的数据未更新,您可能是在处理POST之前构建表单。确保处理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>
...

0

你的页面在“更新”后已经重新加载,因为弹出了“确认表单重新提交”的警报。我猜问题在于在 PHP 脚本中,在处理新的 Post 数据之前,你显示了数据。


0

我倾向于使用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,那么在处理表单的PHP文件中使用简单的header('Location: yourPage.php')即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接