我有一个包含表单的网页,它使用POST方法并引用同一页的提交。我使用一个包含if语句的PHP包含文件,当提交值被设置时运行。但奇怪的是,提交一次后,每次刷新页面都会提交带有先前提交的数据的表单(浏览器在刷新页面之前会发出警告)。这是什么原因,我可能做错了什么?
我有一个包含表单的网页,它使用POST方法并引用同一页的提交。我使用一个包含if语句的PHP包含文件,当提交值被设置时运行。但奇怪的是,提交一次后,每次刷新页面都会提交带有先前提交的数据的表单(浏览器在刷新页面之前会发出警告)。这是什么原因,我可能做错了什么?
这是可以预料的。你应该将表单提交到一个具有唯一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
中,但我们保留它,以便浏览器不认为它是重定向循环。post
,所以仍然可能无法工作。但是,我改进了您的建议,并在查询字符串之外添加了隐藏输入,因此它保持为唯一页面,浏览器不会显示“重定向太多”的消息。 - sjagr<?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
}
?>
你可以做的另一件事是将页面重定向到处理表单的页面之外的另一个页面。我认为这是最安全的方法。
另一种防止这种情况的方法是将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
}
将其默认构建,您就不应该遇到帖子数据的问题。
唯一的例外是文件上传。在这种情况下,在帖子处理手动完成*之后*重定向。