我有2页:
page1.php:
- 有一个带有文本框和“提交”按钮的表单。例如:<form name="frm_register" action="page1.php" method="post">
- 用于将textbox的值存储到数据库的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
- mysql从数据库中检索数据并显示在此页面上。
问题:当我按“返回”按钮时,浏览器会弹出一条警告消息,提示表单将重新提交。单击“返回”按钮时如何防止重新提交表单?是否需要清除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显示警告消息。如何解决这个问题?
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()先发送输出。
答案 0 :(得分:4)
而不是
echo '<script language="javascript">window.location="page2.php";</script>';
您应该在提交后使用header()函数重定向您的用户。
所以在psuedo代码中,
点击page.php action page1.php上的提交 page1.php将数据提交给数据库调用
header('Location: http://example.com/page2.php');
这可以防止您点击回来的问题
答案 1 :(得分:1)
您可以通过实施Post-Redirect-Get (PRG Pattern)来阻止重新提交。
如果你有http_redirect
函数,可能只是一行:
http_redirect("page2.php");
而不是你的javascript回声。
如果没有,那就是两行:
header("Location: http://example.com/page2.php");
exit;
将example.com
替换为网站的主机名。
相关:Back button re-submit form data ($_POST); I am confused about PHP Post/Redirect/Get
答案 2 :(得分:0)
一种方法是通过Ajax将Formdata提交到远程脚本,如果Query返回成功,您可以跳转到“谢谢”页面。 因此,用户可以点击后退按钮,并且不会弹出“重新加载”请求。
希望理念帮助你
答案 3 :(得分:0)
您可以通过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;
}
答案 4 :(得分:0)
在用户点击后退按钮时,在显示为离线的页面中添加此代码:
<?php
session_start();
header_remove("Expires");
header_remove("Cache-Control");
header_remove("Pragma");
header_remove("Last-Modified");
?>
答案 5 :(得分:-1)
创建如here
所示的会话你应该使用会话并从每个页面验证用户,你会惊讶于SESSION如何工作!惊人!