Php 单击“上一步”按钮而不是“$\u POST”值时读取会话

Php 单击“上一步”按钮而不是“$\u POST”值时读取会话,php,session,post,Php,Session,Post,我有3页,使用$\u POST方法传递值。不使用$\u GET方法的原因是我不希望用户转到url并更改值,并且能够传递值。从t2和t3页面开始: t2和t3将检查是否(设置($\u POST))然后保存到会话 当t3.php用户单击“上一步”按钮时,t3不会传递$\u POST数据和读取会话 当将数据从t1传递到t2和t2传递到t3时,它可以工作,但当单击从t3到t2的后退按钮时,浏览器显示“确认表单重新提交”。当用户点击后退按钮时,如何使页面读取会话数据而不是$\u POST值 t1.php

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

  • t2和t3将检查
    是否(设置($\u POST))
    然后保存到会话
  • 当t3.php用户单击“上一步”按钮时,t3不会传递
    $\u POST
    数据和读取会话
  • 当将数据从t1传递到t2和t2传递到t3时,它可以工作,但当单击从t3到t2的后退按钮时,浏览器显示“确认表单重新提交”。当用户点击后退按钮时,如何使页面读取会话数据而不是
    $\u 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>
    
    
    价值1:
    价值2:
    功能测试(){
    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();
    }
    
    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>
    
    
    价值1
    价值2。 价值1: 价值2: 功能测试(){ 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(); }
    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> 
    
    
    价值1
    价值2。
    如果您点击浏览器中的“后退”按钮,您的浏览器将尝试重新创建第一次调用该页面时出现的情况/状态

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

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

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

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

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

    此问题的多个答案解释了一些选项:

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

    • 单击submit按钮,将表单数据发送到t2.php
    • 在t2.php中,检查表单数据是否已发送。如果是,请进行处理
    • 处理调用并发送响应后,第一个调用完成,而不加载实际页面
    • 然后(此处为“success:…”)将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>
    
    //您也可以以不同的方式引用jQuery库:
    //加载页面后,将绑定函数
    $(文档).ready(函数(){
    //获取对窗体的引用
    var$form=$(“#yourFormId”);
    //获取表单的目标URL
    var formURL=form.attr(“操作”);
    //将在单击“提交”按钮时执行
    $form.submit(功能(e){
    //是否阻止表单本身提交数据
    e、 预防默认值();
    //呼叫发送数据
    $.ajax({
    类型:“POST”,
    url:formURL,
    数据:$(this).serialize(),
    cache:false,
    成功:函数(){window.location.href=formURL;}
    });
    });
    });
    
    如果在按下导航器返回按钮时丢失数据,导致页面未加载,则只需添加此
    会话缓存限制器(“私有”否“过期”)
    会话_start()之前这将保持页面加载不变,即使您按下“后退”按钮,并且作为另一种方式,您可以使用get方法和not post来传递参数,因为第一种方法
    session_cache_limiter('private_no_expire')将产生一些问题


    祝您度过愉快的一天

    在发布数据之前检查会话数据?您可以在t3.php上设置会话变量,然后检查t2.php上是否存在该变量。如果是这样,用户点击后退按钮,这样您就可以阅读会话了。如果在使用post数据之前不能直接从会话中读取数据,这是一个选项。@Epodax,是的,因为如果用户键入从t1到t2的新数据,会话应该存储最新的数据value@CharlotteDunois,我已经将值保存在$_SESSION['t2']中,当第t1页到第t2页时,为什么还要再次存储变量?当用户单击后退按钮时,t2页面未读取会话,不确定是否我的代码错误我已尝试更改顺序,首先检查会话,如果(isset($_会话['t2']){}否则如果(isset($_POST)){未设置($_会话['t2']);$_会话['t2']=$_POST;}否则{头(“位置:)}如果我理解正确,上面的代码会检查会话变量t2中是否已经存储了信息。如果已经存储了信息,则不会对其进行更新,对吗?如果是这种情况,那么一旦设置了t2,您将永远无法更新它。我想的是,首先通过ajax发送数据来更新会话数据,而无需加载新页面。之后ajax调用已成功处理,您无需发送数据即可加载新页面。是的,根据上面的评论,一旦会话获得数据,它将无法更新新记录。但是,即使我在t2中以这种方式编写,当我在t3中单击“上一步”按钮时,它仍然显示“确认表单重新提交”“是的,如果为调用该页面而完成表单提交,则始终如此。你的公司