PHP 返回上一页时丢失会话变量

PHP Losing session variables upon going back to previous page

我网站的主页有一个表单,其中包含两个字段:汽车制造商 (carmake) 和汽车型号 (carmodel)。提交后,它会将用户带到第二页,该页面显示有关用户在主页上输入的特定品牌和型号的信息。

我正在使用 post-method 将变量传递到第二页,在那里我使用两个变量开始一个新会话:

    <?php 
       session_start(); 
       $_SESSION['carmake']=$_POST['carmake'];
       $_SESSION['carmodel']=$_POST['carmodel'];
    ?>

这很好用。在第 2 页上,我有一个 link 用于第 3 页,它使用相同的两个会话变量。所以在第 3 页,我用会话函数启动页面,会话变量可供使用。目前没问题。

从现在开始我遇到了 2 个问题:

问题 1: 我在第 3 页上有一个按钮,可以 link 返回到第 2 页。当我使用此按钮返回到第二页时,第二页不会回显会话变量。但是,如果我使用浏览器 'back' 按钮返回到第二页,我会被要求 "confirm resubmission" 我这样做,然后第二页正确地回显会话变量。

我的问题 1: 如何在不丢失会话变量的情况下设计到以前访问过的页面的导航?

问题 2: 有没有办法避免在之前访问过的使用会话变量的页面上 "confirm resubmission"(使用浏览器后退按钮时)?

(我是新手,很简单的问题问了这么久post先说声抱歉。)

问题 1:除非您在分配值之前检查 $_POST 是否有值,否则会话将获得空值。打开更高的错误日志级别并显示错误,您应该会看到有关未定义变量的通知。此外,当您确认提交时它会起作用,因为您正在将数据重新POST发送到第二页。

问题1:在赋值之前检查POST变量是否为空()。

问题 2:据我所知,您将返回浏览器之前 POST 访问过的页面,它想知道您是否想再次访问(以获取 "same" 结果如前)

更新:此外,您应该 post 更多代码。

问题1解决方案:

更改您的代码

<?php 
       session_start(); 
       $_SESSION['carmake']=$_POST['carmake'];
       $_SESSION['carmodel']=$_POST['carmodel'];

<?php 
       session_start(); 

       if(isset($_POST['carmake']))
            $_SESSION['carmake']=$_POST['carmake'];

       if(isset($_POST['carmodel']))
            $_SESSION['carmodel']=$_POST['carmodel'];

它只会在提交表单时设置会话值(这是从 Form1 提交的),所以当您单击后退按钮时,它不会设置空白值并且会保留最后一个会话值)

问题2解答:

<?php 
       session_start(); 

       if(isset($_POST['carmake']))
           $_SESSION['carmake']=$_POST['carmake'];

       if(isset($_POST['carmodel']))
           $_SESSION['carmodel']=$_POST['carmodel'];

       if(isset($_POST['carmake']) || isset($_POST['carmodel'])){
            # Redirect on same page when submitting the form
            # will not ask for form submission when click back on browser page
            header("Location: page2.php")
            exit;
        }

我知道我来晚了,但只是想分享我的解决方案。我希望这对某人有所帮助。

问题 1:解决方案

仅当提交表单时才将值存储在会话中。

<?php 
    session_start();

    if(isset($_POST['carmake'])) $_SESSION['carmake'] = $_POST['carmake'];
    if(isset($_POST['carmodel'])) $_SESSION['carmodel'] = $_POST['carmodel'];

    /* Rest of the code goes here */

问题 2:解决方案(简单的替代方案)

缓存控制和会话缓存限制器可防止在使用浏览器后退按钮时重新提交表单。

<?php 
    session_start(); 

    header("Cache-Control: no cache");
    session_cache_limiter("private_no_expire");

    /* Rest of the code goes here */

~完整代码~

<?php 
    session_start();

    header("Cache-Control: no cache");
    session_cache_limiter("private_no_expire");

    if(isset($_POST['carmake'])) $_SESSION['carmake']=$_POST['carmake'];
    if(isset($_POST['carmodel'])) $_SESSION['carmodel']=$_POST['carmodel'];

    /* Rest of the code goes here */