单击返回按钮而不是 $_POST 值时读取会话

Posted

技术标签:

【中文标题】单击返回按钮而不是 $_POST 值时读取会话【英文标题】:Read session when click back button instead of $_POST value 【发布时间】:2016-04-15 11:34:58 【问题描述】:

我有 3 页,并使用 $_POST 方法传递值。不使用 $_GET 方法的原因是我不希望用户转到 url 并更改值并能够传递值。从头开始为 t2 和 t3 页面:

    t2 和 t3 将检查 if(isset($_POST)) 然后保存到会话中。 当 t3.php 用户点击后退按钮时,t3 不传递$_POST 数据并读取会话

在将数据从 t1 传递到 t2 和 t2 到 t3 时可以工作,但是当单击从 t3 到 t2 的返回按钮时,浏览器显示"Confirm Form Resubmission"。当用户点击返回按钮时,如何让页面读取会话数据而不是 $_POST 值?

t1.php

<html>
<body>
    <form id="b">
        value1: <input type="text" name="value1" id="value1">
        value2: <input type="text" name="value2" id="value2">
        <input type="button" onclick ="test()" value="test">
    </form>
</body>
</html>

<script type="text/javascript">
function test()
    document.getElementById("b").method = "post";
    document.getElementById("b").action = "t2.php";
    document.getElementById("value1").value = "asd";
    document.getElementById("value2").value = "zxc";
    document.getElementById('b').submit();      

</script>

t2.php

<?php 
session_start();

if(isset($_POST))
    unset($_SESSION['t2']);
    $_SESSION['t2']=$_POST;
else if(isset($_SESSION['t2']))

else
    header("Location: http://localhost/my_project/t1.php");


?>

<html>
<body>
    value1<?php echo $_SESSION['t2']["value1"]; ?>!<br>
    value2 <?php echo $_SESSION['t2']["value2"]; ?>.

    <form id="b">
        value1: <input type="text" name="value1" id="value1">
        value2: <input type="text" name="value2" id="value12">
        <input type="button" onclick ="test()" value="test">
    </form>

</body>
</html>

<script type="text/javascript">
function test()
    document.getElementById("b").method = "post";
    document.getElementById("b").action = "t3.php";
    document.getElementById("value1").value = "qwe";
    document.getElementById("value2").value = "rty";
    document.getElementById('b').submit();      

</script>

t3.php

<?php 
session_start();

if(isset($_POST))
    unset($_SESSION['t3']);
    $_SESSION['t3']=$_POST;
else if(isset($_SESSION['t3']))

else
    header("Location: http://localhost/my_project/t1.php");


?>

<html>
<body>
    value1<?php echo $_SESSION['t3']["value1"]; ?>!<br>
    value2 <?php echo $_SESSION['t3']["value2"]; ?>.

</body>
</html> 

【问题讨论】:

您在发布数据之前检查会话数据? 您可以在 t3.php 上设置一个会话变量,然后检查该变量是否存在于 t2.php 上。如果是这样,用户点击后退按钮,您就可以阅读会话。这是一种选择,如果您不能在使用发布数据之前先直接从会话中读取数据。 @Epodax,是的,因为如果用户键入从 t1 到 t2 的新数据,会话应该存储最新的值 @CharlotteDunois,当页面 t1 到 t2 时,我已经保存了 $_SESSION['t2'] 中的值,为什么我还需要再次存储变量?当用户单击返回按钮时,t2 页面未读取会话,不确定是不是我的代码错误 【参考方案1】:

如果您在浏览器中点击“返回”按钮,您的浏览器会尝试重新创建第一次调用该页面时出现的情况/状态。

这意味着,您执行以下操作

1) t1 --> t2 2) t2 --> t3 3) 点击浏览器中的“返回”按钮

现在您的浏览器尝试重新创建情况 1) 以显示页面 t2,并借此重新发布您第一次调用 t2 时发送的数据。

解决此问题的一种方法是始终从会话中加载现有数据并通过 ajax 发布表单,以将下一页的请求和数据的发送分离。如果仅在您从浏览器的角度执行该功能(例如单击绑定到该功能的提交按钮)时发送数据,则调用页面不需要数据。

如果您采用这种方式,您的页面总是会加载存储在您的会话中的数据(并且这是最新的数据)。只有当您通过 ajax 提交数据时,您的会话数据才会更新。

此问题的多个答案中解释了一些选项:jQuery AJAX submit form

我想添加一些代码 sn-p(jQuery/AJAX - 未测试)。它是这样工作的:

单击提交按钮将表单数据发送到 t2.php。 在 t2.php 中检查是否发送了表单数据。如果是,请处理它。 处理调用并发送响应后,第一次调用结束,不加载实际页面。 然后(这里是“成功:...”)t2.php 被加载到浏览器而不发送表单数据。最后一部分是浏览器在打开 t2.php 时执行的操作以及单击后退按钮时执行的操作。

代码片段:

// You can also reference the jQuery library differently than this:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js">

// Will bind the function, once the page is loaded
$(document).ready(funtion()

// Gets a reference to your form
var $form = $('#yourFormId');

// Gets the target URL of your form
var formURL = form.attr("action");

// Will be execured when you click the submit button
$form.submit(funtion(e)
    // Does stop the form from submitting data itself
    e.preventDefault();
    // Call to send data
    $.ajax(
        type: "POST",
        url: formURL,
        data: $(this).serialize(), 
        cache: false,
        success: function()  window.location.href = formURL; 
    );
  );
);
</script>

【讨论】:

我已经尝试改变顺序,首先检查会话,仍然面临同样的错误 if(isset($_SESSION['t2'])) else if(isset($_POST))未设置($_SESSION['t2']); $_SESSION['t2']=$_POST; else header("位置:localhost/my_project/t1.php"); 如果我的想法正确,上面的代码会检查会话变量 t2 中是否已经存储了信息。如果是这样,它不会更新,对吗?如果是这种情况,您将永远无法更新 t2 设置后。我的想法是首先通过 ajax 发送数据以更新会话数据而不加载新页面。成功处理 ajax 调用后,您无需发送数据即可加载新页面。 是的,根据上面的评论,一旦会话获得数据,它将无法更新新记录。但是,即使我在 t2 中这样写,当我从 t3 单击返回按钮时,它仍然显示“确认表单重新提交” 是的,如果为调用该页面完成了表单提交,它将始终如此。您的代码在服务器端运行。但是客户端的浏览器知道它上次调用 t2.php 时发送了数据,并希望再次执行此操作。它不知道服务器端会发生什么,因此它假设正确调用 t2.php 它需要发送一些数据(并且希望重新提交它上次提交的数据)。【参考方案2】:

如果您在按下导航器后退按钮时丢失数据,导致页面未加载,您只需在 session_start(); 之前添加此 session_cache_limiter('private_no_expire');,即使您按下后退按钮,页面也会保持原样加载作为另一种方式,您可以使用 get 方法而不是 post 来传递参数,因为第一种方法 session_cache_limiter('private_no_expire'); 会产生一些问题

祝你有美好的一天

【讨论】:

以上是关于单击返回按钮而不是 $_POST 值时读取会话的主要内容,如果未能解决你的问题,请参考以下文章

每次我单击自动填充按钮时,它都会在字段中返回“nil”而不是保存的字符串

从连续反应中读取会话存储的变化

单击浏览器返回时会话消息重复

从 NavigationController 后退按钮返回多个 ViewController

如何使向上按钮返回而不是打开导航抽屉

PHP,单选按钮返回,而不是价值