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

3
我的网站首页有一个表单,包含两个字段:汽车品牌(carmake)和汽车型号(carmodel)。用户提交后,将跳转到第二个页面,显示用户在首页输入的特定品牌和型号的信息。
我使用POST方法将变量传递到第二个页面,在那里我使用这两个变量启动一个新会话。
    <?php 
       session_start(); 
       $_SESSION['carmake']=$_POST['carmake'];
       $_SESSION['carmodel']=$_POST['carmodel'];
    ?>

这很好用。在第二页上,我有一个链接到第三页的按钮,该链接使用相同的两个会话变量。因此,在第三页上,我使用会话函数开始页面,会话变量可供使用。到目前为止没有问题。
从这一点出发,我遇到了两个问题:
问题1:我在第三页上有一个按钮,可以链接回第二页。当我使用此按钮返回到第2页时,第二页不会回显会话变量。但是,如果我使用浏览器后退按钮返回第2页,则会被要求“确认重新提交”,我会这样做,然后第2页会正确地回显会话变量。
我的问题1:如何设计导航以访问先前访问过的页面而不丢失会话变量?
问题2:是否有一种方法可以避免在使用会话变量的先前访问过的页面上“确认重新提交”(使用浏览器后退按钮)?

提供第二页代码,出现问题的地方。 - Choxx
3个回答

7

问题1的解决方案:

修改你的代码。

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

To

<?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;
        }

第一个问题的解决方案完美地运作。它解决了两个问题:我可以使用网页上的“返回”按钮(链接)或浏览器上的“返回”按钮从第三页返回到第二页。然而,第二个解决方案不起作用。我对此有疑问。我应该将它放在第二页还是第三页? - sarbee
在第二页,实际上两个代码是相同的,唯一不同的是重定向代码,它将在提交代码时将第二页重定向,以忽略来自第三页的表单提交。 - Nouman Arshad

1
问题1:除非您在分配变量之前检查$_POST是否具有值,否则会使会话获得空值。打开更高的错误日志级别并显示错误,您应该会看到有关未定义变量的通知。此外,当您确认提交时,它可以工作,因为您正在将数据重新POST到第二个页面。
问题1:在分配变量之前,请检查POST变量是否为空()。
问题2:据我所知,您正在返回到浏览器先前POST的页面,并且它想知道您是否要再次(以获取与之前相同的结果)。
更新:此外,您应该发布更多代码。

0

我知道我来晚了,但是想分享我的解决方案。希望能帮到有需要的人。

问题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 */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接