所以这是交易,我使用HTML表单从页面到页面传输变量,PHP脚本根据提交的值创建页面.通常它看起来像这样:从项目目录中选择您想要的内容,下一页显示该特定项目的详细信息.一切都很完美,除了一件事:
每当我使用浏览器的后退按钮时,我总是会收到错误: ERR_CACHE_MISS,我需要刷新页面,然后确认我确实要重新提交数据.
有没有办法解决这个问题,所以我的客户可以按原样使用后退按钮.
以下是浏览器为我提供的全文:
此网页需要您之前输入的数据才能正确显示.您可以再次发送此数据,但通过这样做,您将重复此页面之前执行的任何操作.重新加载此网页.按重新加载按钮重新提交加载页面所需的数据.错误代码:ERR_CACHE_MISS
小智 24
当您使用php或任何其他数据发布表单时,您可以返回页面并在浏览器中查找消息,如"文档已过期"或"使用Chrome确认表单重新提交".这些消息是浏览器使用敏感数据(如变量后)的安全预防措施.浏览器不会再自动为您提供新页面.您必须通过再次单击"重试"或使用页面刷新来重新加载页面.然后,它按照您的预期运行.
然而,php编码器可以通过在脚本中添加一些代码来解决来自浏览器的烦人消息.该示例显示了几行代码可以添加到session_start()之上,以便能够在没有任何挂起的情况下发送到页面.'private_no_expire'模式意味着客户端将不会收到首先是过期的标题.
header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
session_start();
Run Code Online (Sandbox Code Playgroud)
**一些背景:由于他出色的解释,信用到布鲁斯(sqlwork.com).
此网页需要您之前输入的数据才能正确显示.您可以再次发送此数据,但通过这样做,您将重复此页面之前执行的任何操作.按"重新加载"重新发送该数据并显示此页面.
由于Web开发人员的草率编码实践,浏览器被迫添加此消息.方案如下:
1)用户填写表格并提交(发布表格)2)服务器处理发布数据并用标记为不可缓存的新页面(确认)进行响应3)用户导航到新页面.4)用户按下:
对于浏览器在步骤2中显示页面,因为它标记为no-cache,所以必须从服务器请求它,换句话说就是重新发布数据(做第1步).这里是邋code的编码进来,如果这是一个信用卡收费,并且重新发送检测不在服务器上,该卡被收取两次.这是一个常见的问题,浏览器必须检测到这一点并警告用户.
最好的解决方法是在第二步中,服务器将重定向发送到确认页面.然后,当用户通过历史记录或返回访问确认时,它是一个获取请求,而不是一个发布请求,并且不会显示警告.
注意: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']="";
}
Run Code Online (Sandbox Code Playgroud)
可选 - 如果已登录,请将电子邮件地址分配给$ _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>
Run Code Online (Sandbox Code Playgroud)
错误框
<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
不建议在付款页面上使用,请参阅上面的讨论.在Firefox,Chrome,Safari和IE9中测试过.使用后退按钮时,烦人的消息消失了.确保在php脚本或php.ini中"打开"输出缓冲以避免标题警告.您可以检查您的php.ini文件以获取以下信息;
output_buffering=On
Run Code Online (Sandbox Code Playgroud)
我发现只是使用:
header('Cache-Control: no cache'); //disable validation of form by the browser
Run Code Online (Sandbox Code Playgroud)
解决问题
其他答案都不适合我。
这个简单的 JavaScript 解决了后退按钮抛出“ERR_CACHE_MISS”的问题
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我尝试了这个答案,没问题。您必须将此代码放在session_start()::
session_cache_limiter('private, must-revalidate');
session_cache_expire(60);
Run Code Online (Sandbox Code Playgroud)
祝你好运
小智 0
<?php
if(isset($_POST['submit']))
{
//submission goes here
}
?>
Run Code Online (Sandbox Code Playgroud)
这就是你的想法吗?
编辑 - SQL 确实是一个很好用的东西,我看到它已被添加为评论中的推荐,并且我同意如果可以的话使用 SQL,它快速、直观且高效。
| 归档时间: |
|
| 查看次数: |
42990 次 |
| 最近记录: |