**一些背景:由于他的优秀解释,信贷转到布鲁斯(sqlwork.com)。
此网页需要您在之前输入的数据才能正常显示。您可以再次发送这些数据,但这样做会重复此页执行的任何操作。按重新加载重新发送该数据并显示此页面。
由于web开发浏览器的马虎的编码习惯的人被迫加入这个消息。方案如下:
1)用户填写表单并提交(职位形成) 2)服务器进程后的数据,并用一个新的页面(确认响应)标记为不可缓存 3)用户导航到一个新的页面。 4)用户按回:
为浏览器在第2步显示页面,因为它标记为no-cache,它必须从服务器请求它,换句话说做数据转发(do步骤1)。这里是潦草的编码进来,如果这是一个信用卡收费,并重新发布检测不在服务器上,该卡收取两次。这是一个常见的问题,浏览器必须检测并警告用户。
最好的修复方法是在第二步中,服务器发送重定向到确认页面。那么当用户通过历史记录或后退访问确认时,其获取请求而不是发布请求,并且不会显示警告。
注:webform的回发模型适用于这个问题。也避免服务器传输。
我的解决方案
$ _SESSION [ '家']用于存储主页上的任何错误。
$ _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
你使用一台服务器开放结束数据存储? MySQL,Redis?最好的方法是在用户导航时将数据存储在服务器上。 –
由此你的意思是我需要在用户会话期间存储来自提交表单的所有值?我可以使用会话存储吗? –
您可以使用会话存储,但它不是很适合扩展,并且如果每个数据量从一点点到多点都会变成错误的方式。我会说作业会话存储是好的,对于生产来说是不够的。 –