2013-10-07 106 views
10

因此,这里的交易, 我使用HTML表单从页面变量传递到页面和PHP脚本来创建基于提交的数据的网页。 一般来说,它看起来像这样:从你选择你想要的项目目录,下一个页面显示这个特定项目的细节。一切都运行完美,除了一两件事:导航回用PHP表单提交

每当我使用浏览器的后退按钮,我总是得到错误:ERR_CACHE_MISS,我需要刷新页面,然后确认,我真的要重新提交数据。

有什么办法来解决这个问题,所以我的客户将能够为他们应该只使用后退按钮。

以下是完整的文本浏览器提供我:

This webpage requires data that you entered earlier in order to be properly displayed. You can send this data again, but by doing so you will repeat any action this page previously performed. Reload this webpage. Press the reload button to resubmit the data needed to load the page. Error code: ERR_CACHE_MISS

+2

你使用一台服务器开放结束数据存储? MySQL,Redis?最好的方法是在用户导航时将数据存储在服务器上。 –

+0

由此你的意思是我需要在用户会话期间存储来自提交表单的所有值?我可以使用会话存储吗? –

+0

您可以使用会话存储,但它不是很适合扩展,并且如果每个数据量从一点点到多点都会变成错误的方式。我会说作业会话存储是好的,对于生产来说是不够的。 –

回答

0
<?php 
if(isset($_POST['submit'])) 
{ 
//submission goes here 
} 
?> 

这是你在想什么?

编辑 - SQL确实是一个美丽的东西有,我看到它被添加在评论推荐工作,我同意使用SQL如果可以的话,它的快速,直观,高效。

+2

不,甚至没有 – ElefantPhace

8

**一些背景:由于他的优秀解释,信贷转到布鲁斯(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 
18

当你发布使用PHP的形式,或任何其他数据,你可能会回到该网页,寻找像“文档过期”或“确认重新提交表单有了Chrome”浏览器的消息。这些消息是浏览器使用敏感数据(如post变量)的安全防范措施。浏览器不会再自动给你新的页面。您必须重新加载页面,方法是再次单击“尝试”或刷新页面。然后,它按照您的预期运行。

但是,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(); 
2

我试过这个答案,没关系。 你必须把之前的代码:session_start()

session_cache_limiter('private, must-revalidate'); 
session_cache_expire(60); 

好运

4

我发现,使用刚:

header('Cache-Control: no cache'); //disable validation of form by the browser 

解决问题