单击后退按钮而不是$ _POST值

时间:2016-01-11 08:15:48

标签: php session post

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

  1. t2和t3将检查是否(isset($ _ POST))然后保存到会话中。
  2. 当t3.php用户点击后退按钮时,t3没有传递$ _POST数据并读取会话
  3. 在将数据从t1传递到t2和t2到t3时能够工作,但是当从t3到t2点击后退按钮时,浏览器显示"确认表单重新提交"。当用户点击后退按钮时,如何让页面读取会话数据而不是$ _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> 
    

2 个答案:

答案 0 :(得分:1)

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

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

1)t1 - &gt; T2
2)t2 - &gt; T3
3)点击浏览器中的“后退”按钮

现在您的浏览器尝试重新创建情境1)以显示第t2页,并且这样想重新发布您第一次调用t2时发送的数据。

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

如果按照这种方式进行操作,您的页面就会加载存储在会话中的数据(这是最新的数据)。只有通过ajax提交数据时,您的会话数据才会更新。

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

我想添加一些代码片段(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>

答案 1 :(得分:1)

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

祝你愉快