我有两个页面:
page1.php:
-有一个带有文本框和"提交"按钮的表单。例如:<form name="frm_register" action="page1.php" method="post">
—PHP和mysql代码将文本框的值存储到数据库。在将值提交给数据库后,Javascript会将页面重定向到php2.php
。例如:
$query = "INSERT INTO traceuser (username) VALUES ('{$username}')";
$result = mysql_query($query, $connection);
echo '<script language="javascript">window.location="page2.php";</script>';
page2.php
问题:当我按下"返回"按钮时,浏览器会弹出一个警告消息,说表单将被重新提交。如何防止在点击"返回"按钮时重新提交表单?我是否需要清除page1.php的缓存?如何做它与php或javascript或ajax?
更新1:感谢您将javascript
window.location="page2.php"
替换为php header('Location: home2.php');
的答案。它解决了80%的问题。剩下的20%的问题如下:
if (strtotime($_SESSION['servertime']) < time()-3){ //10800 = 3 hours 3600 = 1 hour
if (($username != "") AND ($username != $_SESSION[username])){
$_SESSION['servertime'] = $servertime;
$_SESSION['username'] = $username;
$query = "INSERT INTO traceuser (username) VALUES ('{$username}')";
$result = mysql_query($query20, $connection);
header('Location: page2.php');
exit;
} else {
echo "same name"; //problem here
}
}else{
echo "submit multiple data too fast"; //problem here too.
}
}
执行以下步骤时出现问题:
1)用户提交数据成功,跳转到page2.php查看记录
2)用户点击"返回"按钮,跳转回page1.php。
3)用户提交数据失败,停留在page1.php。(因为太快或者同名)
4)用户提交数据成功,跳转到page2.php查看记录
5)用户点击"返回"按钮,浏览器提示"表单将被重新提交"
问题出在步骤3。步骤3没有运行header('Location: page2.php');
,没有跳转到page2.php。因此,它导致第5步显示警告消息。如何解决这个问题?
更新2:我已经找到了解决20%问题的方法,它工作得很好。我使用
session['error123']
来决定是否要显示错误信息"同名"。我杀死session['error123']
如果成功提交数据到数据库或如果成功跳转到page2.php。我还使用header('Location: page1.php');
重定向到自己的页面(同一页面),使页面忘记之前的表单提交。代码示例:
if ($_SESSION['error123'] == "toofast"){
echo $_SESSION['error123'] ;
}elseif ($_SESSION['error123'] == "samename"){
echo $_SESSION['error123'] ;
}
if (strtotime($_SESSION['servertime']) < time()-3){ //10800 = 3 hours 3600 = 1 hour
if (($username != "") AND ($username != $_SESSION['username'])){
$_SESSION['username'] = $username;
$query = "INSERT INTO traceuser (username) VALUES ('{$username}')";
$result = mysql_query($query20, $connection);
$_SESSION['error123'] = "aa";
header('Location: http://localhost/plekz/page2.php');
exit;
} else {
$_SESSION['error123'] = "samename";
header('Location: http://localhost/plekz/page1.php');
exit;
}
}else{
$_SESSION['error123'] = "toofast";
header('Location: http://localhost/plekz/page1.php');
exit;
}
}
}
注意:你需要缓冲<?php ob_start();?>
的输出,因为$_SESSION不能放在header()之前。Buffer将停止包括session在内的所有输出,让header()先发送输出
而不是
echo '<script language="javascript">window.location="page2.php";</script>';
你应该使用header()函数在提交后重定向你的用户。
在psuedo代码中,
在page.php上点击提交动作page1.phpPage1.php提交数据到数据库调用
header('Location: http://example.com/page2.php');
这应该可以防止你点击返回的问题
您可以通过实现Post-Redirect-Get (PRG模式)来防止重新提交。
可以只是一行,如果你有http_redirect
函数:
http_redirect("page2.php");
代替javascript的echo。
如果没有,那就是两行:
header("Location: http://example.com/page2.php");
exit;
将example.com
替换为站点的主机名
相关:返回按钮重新提交表单数据($_POST);我很困惑PHP Post/Redirect/Get
一种方法是通过Ajax将Formdata提交给远程脚本,如果查询返回成功,则可以跳转到"Thank you"页面。所以用户可以点击后退按钮,"重新加载"请求不会弹出。
希望这个想法对你有帮助
可以通过Ajax调用来代替吗?表单上没有任何动作,提交将调用Ajax函数。Ajax调用将执行查询,并提供响应(您可以只是回送一个结果),然后您可以根据结果提供动态反馈。你永远不会离开这页。
<form id="thisForm">
...form input fields...
<input type="button" onclick="return submitForm('thisForm')"/>
</form>
function submitForm(formId) {
$.ajax( {
type: "post",
url: 'page2.php',
data: $('#' + formId + ' input').serialize(),
... any other Ajax parameters...,
success: function(data) {
}
});
return false;
}
在用户单击后退按钮时显示为脱机的页面中添加以下代码:
<?php
session_start();
header_remove("Expires");
header_remove("Cache-Control");
header_remove("Pragma");
header_remove("Last-Modified");
?>
创建如下所示的会话
你应该使用session并从每个页面验证用户,你会惊讶于session是如何工作的!神奇的!