**一些背景:感谢布鲁斯(sqlwork.com)的出色解释。
此网页需要您之前输入的数据才能正确显示。您可以再次发送此数据,但这样做将重复此页面以前执行的任何操作。按重新加载以重新发送该数据并显示此页。
由于Web开发人员的草率编码实践,浏览器被迫添加此消息。方案如下:
1)用户填写表单并提交(帖子表单)2)服务器处理帖子数据并用标记为不可缓存的新页面(确认)进行响应3)用户导航到新页面。4)用户按后按:
对于浏览器在步骤2中显示页面,因为它标记为无缓存,它必须从服务器请求它,换句话说,做数据的重新发布(做步骤1)。这里是草率的编码进来的,如果这是信用卡收费,并且转发检测不在服务器上,则卡被收取两次。这是一个非常普遍的问题,浏览器必须检测到这一点并警告用户。
最好的解决方法是在第二步中,服务器发送重定向到确认页面。然后,当用户通过历史记录或返回访问确认时,这是一个获取请求,而不是发布请求,并且不会显示警告。
注意:Webform的回发模型适合解决这个问题。还要避免服务器传输。
我的解决方案
$_SESSION['home'] 用于在主页上存储任何错误。
$_SESSION['tempEmail']用于在php表单上回显值。
注意:对于具有用于错误处理的 HTML 表单的每个页面,以及对于 HTML 表单上回显的每个值,请使用一个唯一的会话变量。
<?php
session_start();
//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}
可选 - 如果已登录,请将电子邮件地址分配给 $_SESSION['tempEmail'] 变量(如果以前未完成)以预填充 HTML 表单。
if(isset($_POST['Submit'])){
---your code---
//Error message(s) examples
$_SESSION['home'] = "Email and Password do not match, please try again.";
header("Location: " . $_SERVER['REQUEST_URI']);
$_SESSION['home'] = "Email address format is invalid. Please recheck.";
header("Location: " . $_SERVER['REQUEST_URI']);
//success
unset ($_SESSION['home']); //optional, unset to clear form values.
header ("location: nextpage.php");
---or---
header("Location: " . $_SERVER['REQUEST_URI']); //re-post to same page with the $_SESSION['home'] success message.
}
?>
<body>
错误框
<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>
HTML 表单
<form action="#" name="loginform" method="post" >
<input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/>
<input type="submit" name="Submit" value="Submit">
</form>
</body>
不建议在付款页面上使用,请参阅上面的讨论。在 Firefox、Chrome、Safari 和 IE9 中进行了测试。使用后退按钮时,烦人的消息消失了。确保在 php 脚本或 php 中“打开”输出缓冲.ini以避免标头警告。您可以检查您的php.ini文件以下内容;
output_buffering=On