【发布时间】:2011-12-06 13:10:10
【问题描述】:
我有 2 页:
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
- 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 步显示警告消息。如何解决这个问题?
更新 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() 之前。 Buffer会停止包括session在内的所有输出,让header()先发送输出。
【问题讨论】:
-
您的问题中剩下的 20% 与 I am confused about PHP Post/Redirect/Get 相同,请参阅此 tutorial,第 2 节。绝不允许重新提交表单.
-
@hakre,您建议的解决方案是将提交表单数据的脚本与接收和处理该数据的脚本分开,对吗?如果我这样做,我的 page1.php 必须负责两个任务: 1) 如果 $_Get['success']!=true,则在页面上显示带有文本框和提交按钮的表单,如果 $_Get[ 则必须显示所有记录'成功']==真。如果显示记录必须依赖于 php if else 语句,那么我需要通过 php echo 包装显示记录的 html 代码。将所有html包装在php echo中将是很多工作...... omg。
标签: php javascript mysql