页面刷新会导致表单提交


Page refresh causes form submission

我有一个网页,其中包含一个使用 POST 方法的表单,并引用它用于提交的同一页面。我正在使用一个 PHP 包含文件,其中包含在设置提交值时运行的 if 语句。但是出于某种原因,在一次提交后,每次刷新页面时,它都会使用先前提交的数据提交表单(浏览器在刷新页面之前会警告这一点)。是什么原因造成的,我可能做错了什么?

这是

意料之中的。应将表单提交到具有唯一 URL 的处理程序,无论是查询字符串还是不同的 URI。一个解决方案(许多解决方案)是更改表单操作:

<form action="?action=submit" method="post">
  <input type="hidden" name="action" value="submit" />
  ...

然后在 PHP 脚本中处理表单,然后将上下文更改回没有隐藏查询字符串的 URL

if (!empty($_POST['action']) && $_POST['action'] == 'submit') {
    // do stuff
    header('Location: '.$_SERVER['SCRIPT_NAME']);
    die();
}

请注意,查询字符串实际上并不存在于$_POST中,但我们将其保留在那里,以便浏览器不会将其视为重定向循环。

我的一个页面遇到了同样的问题。原因是当浏览器警告您将再次提交表单时,这意味着当您单击提交按钮时,它将完全相同。

我做了两件事来避免它,但我相信还有很多其他方法。1. 成功提交表单后,不要让页面再次回显表单。我的是这样的

<?php
 if(!isset($_POST['submit'])) {
include(form.php);// you can modify this according to your needs.
} else {
//display your message about what happened with the form.
}
?>

使用这种方法,您的页面将不会提交表单,但这不会阻止它在刷新时提交。2. 如果表单已提交,则创建一个带有值的 contriper 输入,指示表单已提交。例如,将其放入表单中:

<?=(isset($_POST['submit']))?"" :"<input type-"hidden" name="submit_stat" value="true" />" ; ?>

当你在提交表单时处理表单时,请用你的PHP检查它,并使脚本像这样对该变量进行操作:

<?php
if($_POST['submit_stat']==true) {
//do not process the form here.
//stop your script
}
?>

您可以做的另一件事是将页面重定向到处理表单的页面以外的其他页面。 我相信这是最安全的。

防止这种情况的另一种方法是将发布数据移动到会话、重定向、从会话收集回发并删除会话发布数据。

if(!empty($_POST) && empty($_FILES)){
    // move post to session
    // redirect to same url (don't forget possible get query)
}else{
    // collect post from session
    // unset post from session
}

将其构建为默认值,并且您永远不会遇到发布数据的问题.
只有文件上传除外。在这种情况下,手动重定向*后*处理