Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP表单提交返回_Php_Html_Forms - Fatal编程技术网

使用PHP表单提交返回

使用PHP表单提交返回,php,html,forms,Php,Html,Forms,这就是交易, 我使用HTML表单在页面之间传递变量,使用PHP脚本根据提交的值创建页面。 通常是这样的:从项目目录中选择所需内容,下一页显示此特定项目的详细信息。一切都很完美,除了一件事: 每当我使用浏览器的“后退”按钮时,总会出现错误:ERR\u CACHE\u MISS,我需要刷新页面,然后确认我确实想重新提交数据 有没有办法解决这个问题,这样我的客户就可以按照他们的想法使用后退按钮了 以下是browser为我提供的全文: 此网页需要您先前输入的数据才能访问 正确显示。您可以再次发送此数据,

这就是交易, 我使用HTML表单在页面之间传递变量,使用PHP脚本根据提交的值创建页面。 通常是这样的:从项目目录中选择所需内容,下一页显示此特定项目的详细信息。一切都很完美,除了一件事:

每当我使用浏览器的“后退”按钮时,总会出现错误:ERR\u CACHE\u MISS,我需要刷新页面,然后确认我确实想重新提交数据

有没有办法解决这个问题,这样我的客户就可以按照他们的想法使用后退按钮了

以下是browser为我提供的全文:

此网页需要您先前输入的数据才能访问 正确显示。您可以再次发送此数据,但必须这样做 您将重复此页面以前执行的任何操作。重新加载这个 网页。按重新加载按钮重新提交加载所需的数据 这一页。错误代码:错误\u缓存\u未命中

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

你是这么想的吗


编辑-SQL确实是一个很好的工具,我看到它被作为一个建议添加到评论中,我同意如果可以的话使用SQL,它快速、直观、高效。

**一些背景:布鲁斯(sqlwork.com)的出色解释值得称赞

此网页需要您先前输入的数据才能正确显示。您可以再次发送此数据,但这样做会重复此页面以前执行的任何操作。按“重新加载”重新发送该数据并显示此页面

由于web开发人员草率的编码实践,浏览器被迫添加此消息。情况如下:

1) 用户填写表单并提交(发布表单) 2) 服务器处理post数据,并用标记为不可缓存的新页面(确认)进行响应 3) 用户导航到新页面。 4) 用户按下back:

要使浏览器在步骤2中显示该页面,由于其标记为无缓存,因此必须从服务器请求该页面,换句话说,重新发布数据(执行步骤1)。这里是我们的草率编码进来,如果这是一个信用卡收费,并在服务器上没有检测到转售,卡收费两次。这是一个非常常见的问题,浏览器必须检测到并警告用户

最好的解决方法是在第二步,服务器将重定向发送到确认页面。然后,当用户通过历史记录或返回访问确认时,它是一个get请求,而不是post请求,并且不会显示警告

注意:webform的回发模型有助于解决这个问题。还要避免服务器传输

我的解决方案

$\u会话['home']用于在主页上存储任何错误

$\用于在php表单上回显值的会话['tempEmail']

注意:对于具有HTML表单用于错误处理的每个页面,使用一个唯一的会话变量,对于HTML表单上回显的每个值,也使用任何会话变量

<?php
session_start(); 

//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}
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>

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

我试过这个答案,没问题。 您必须将此代码置于以下位置之前:
会话\u start()


祝你好运

我发现只需:

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

解决问题

其他答案对我都不起作用

  • 我不想改变方向
  • 设置不同的标题无效
  • 我已经在我的帖子中使用了代币来确保不会再次提交
  • 我发布到表单显示的相同url
这个简单的javascript修复了我的返回按钮抛出“ERR\u CACHE\u MISS”的问题


您是否愿意使用服务器端数据存储?MySQL,Redis?最好的方法是在用户导航时将数据存储在服务器上。您的意思是我需要在用户会话期间存储提交表单中的所有值?我可以使用会话存储吗?您可以使用会话存储,但它不是非常具有可扩展性,如果每个会话的数据量从一点点增加到一点点以上,那么它将成为一种错误的方式。我想说,对于家庭作业会话存储是好的,对于生产来说,这是不够的。嗯,我有一个非常小的项目,只有两个级别的导航(目录和项目详细信息),所以我只需要存储2-3个链接就可以返回目录,所以我想这对我来说是可行的。我可以用什么方式连接后退按钮和会话存储?为什么他不能使用会话?它们在未登录的情况下被广泛用于购物车(cookies也是如此),用于存储搜索查询等。因此,是的,在我看来,会话是一个很好的方法。1) 提交表单,2)在会话中存储表单数据,3)重定向到基于会话执行操作的页面,4)享受。如果用户按下返回键,他/她将使用会话而不是post数据进入页面。这对我不起作用,我有完全相同的场景,这是否发生了变化?这真的很好,我正在寻找一些基于JS的答案,以摆脱恼人的“确认表单重新提交”提示。对于那些可能不理解的人,这会在浏览器上添加一个历史状态,以便当用户单击“后退”按钮时
output_buffering=On
header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
session_start();
session_cache_limiter('private, must-revalidate');
session_cache_expire(60);
header('Cache-Control: no cache'); //disable validation of form by the browser
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}