使用PHP表单提交导航回来

时间:2013-10-07 00:48:56

标签: php html forms

所以这是交易, 我正在使用HTML表单从页面到页面传输变量,并使用PHP脚本根据提交的值创建页面。 通常它看起来像这样:从项目目录中选择您想要的内容,下一页显示该特定项目的详细信息。一切都很完美,除了一件事:

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

有没有办法解决这个问题,所以我的客户可以按原样使用后退按钮。

以下是浏览器为我提供的全文:

  

此网页需要您之前输入的数据   正确显示。您可以再次发送此数据,但这样做   您将重复此页面之前执行的任何操作。重新加载   网页。按重新加载按钮重新提交加载所需的数据   这页纸。错误代码:ERR_CACHE_MISS

6 个答案:

答案 0 :(得分: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();

答案 1 :(得分:8)

**一些背景:由于他出色的解释,他认可布鲁斯(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']="";
}

可选 - 如果已登录,请将电子邮件地址分配给$ _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

答案 2 :(得分:6)

我发现只使用:

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

解决问题

答案 3 :(得分:2)

我试过这个答案,没关系。 您必须先将此代码放在:session_start()

session_cache_limiter('private, must-revalidate');
session_cache_expire(60);
祝你好运

答案 4 :(得分:0)

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

这是你在想什么?

编辑 - SQL真的是一件很棒的事情,我发现它已被添加为评论中的推荐,我同意尽可能使用SQL,它快速,直观和高效。

答案 5 :(得分:-1)

没有其他答案对我有用。

  • 我不想重定向
  • 设置不同的标题无效
  • 我已经在帖子中使用了令牌,以确保不会再次提交
  • 我发布到表单显示的相同网址

这个简单的javascript修复了我的后退按钮抛出“ ERR_CACHE_MISS”的问题

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}