页面刷新导致表单提交

时间:2013-12-18 18:07:41

标签: php html

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

3 个答案:

答案 0 :(得分: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 :(得分: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
}

?>

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

答案 2 :(得分:0)

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

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
}

将其设为默认值,您应该永远不会遇到帖子数据问题 只有例外是文件上传。在这种情况下,重新定位 * 之后 * 后处理。