我有两页:
page1.php :
<form name="frm_register" action="page1.php" method="post">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']来决定是否要显示“同名”错误消息。如果成功地将数据提交到数据库,或者如果成功跳转到page2.php,我就会杀死session['error123']。我还使用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()之前。缓冲区将停止包括会话在内的所有输出,让header()首先发送输出。
发布于 2011-10-12 23:18:44
而不是
echo '<script language="javascript">window.location="page2.php";</script>';
在提交之后,您应该使用header()函数来重定向用户。
所以在psuedo代码中,
单击page.php动作提交page1.php page1.php将数据提交给数据库调用
header('Location: http://example.com/page2.php');这将防止您的单击回退问题。
发布于 2011-10-12 23:16:57
您可以通过实现后重定向-获取(PRG模式)来防止重新提交。
如果您有http_redirect函数,那么可能只是一行:
http_redirect("page2.php");而不是你的javascript回显。
如果没有,这是两行:
header("Location: http://example.com/page2.php");
exit;用站点的主机名替换example.com。
发布于 2011-10-12 23:05:34
一种方法是通过Ajax将Formdata提交到远程脚本,如果查询返回成功,则可以跳过a“谢谢”页面。这样用户就可以点击Back Button,"Reload“请求就不会弹出。
希望这个想法对你有帮助
https://stackoverflow.com/questions/7747569
复制相似问题