使用 PHP 表单提交向后导航

2022-08-30 21:33:54

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

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

有没有办法解决这个问题,所以我的客户将能够像他们应该的那样使用后退按钮。

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

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


答案 1

当您使用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

**一些背景:感谢布鲁斯(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

推荐