页面刷新导致表单提交

4

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


展示一些代码,否则我们只能进行猜测。 - Julio
1
这是刷新表单提交结果页面时的预期行为。如果您链接或导航到URL而不是刷新,您将获得未提交的页面。 - Digital Chris
当您通过POST提交表单,然后刷新页面时,这是预期的行为。 - Leonardo
1
PRG,PRG!http://en.wikipedia.org/wiki/Post/Redirect/Get - SirDarius
3个回答

2

这是可以预料的。你应该将表单提交到一个具有唯一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
我会在处理器中添加一个重定向到第三个页面的步骤。否则,如果用户刷新您的着陆页,他们将再次提交其数据。 - Tim
1
重定向到没有查询字符串的同一页面是“第三页”。 - sjagr
我刚刚发现你代码里似乎有个笔误,希望我的更正没问题。 - wkille
@wkille 谢谢 - 看起来社区(而不是我)拒绝了它,可能是因为表单方法是 post,所以仍然可能无法工作。但是,我改进了您的建议,并在查询字符串之外添加了隐藏输入,因此它保持为唯一页面,浏览器不会显示“重定向太多”的消息。 - sjagr

0
我在我的一个页面上遇到了同样的问题。 原因是当浏览器警告您将再次提交表单时,这意味着当您单击提交按钮时它将是完全相同的内容。
为了避免这种情况,我做了两件事情,但我相信还有许多其他方法。 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. 如果表单已经被提交,请创建一个控制器输入,其中包含一个值指示表单已经被提交。例如,将其放入您的表单中:

<?=(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
}

?>

你可以做的另一件事是将页面重定向到处理表单的页面之外的另一个页面。我认为这是最安全的方法。


0

另一种防止这种情况的方法是将Post数据移动到Session中,重定向,从Session中收集Post数据并删除Session Post数据。

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
}

将其默认构建,您就不应该遇到帖子数据的问题。
唯一的例外是文件上传。在这种情况下,在帖子处理手动完成*之后*重定向。


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