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

时间:2015-03-31 18:45:46

标签: php session-variables

我网站上的主页有一个包含两个字段的表单:Make of the Car(carmake)和Car Model(carmodel)。提交后,它会将用户带到第二页,显示有关用户在主页上输入的特定品牌和型号的信息。

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

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

这很好用。在第2页,我有一个第3页的链接,它使用相同的两个会话变量。因此,在第3页,我使用会话功能启动页面,并且会话变量可供使用。到目前为止没问题。

从这一点开始,我遇到了两个问题:

问题1:我在第3页上有一个链接回第2页的按钮。当我使用此按钮返回第2页时,第2页不会回显会话变量。但是,如果我使用浏览器&#39;返回&#39;按钮返回第2页,我被要求&#34;确认重新提交&#34;我做了,然后第二页正确回应会话变量。

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

问题2:有没有办法避免必须&#34;确认重新提交&#34; (在使用浏览器后退按钮时)在以前访问过的使用会话变量的页面上?

(我是这里的新手,并提前为长篇文章道歉,这可能是一个非常简单的问题。)

3 个答案:

答案 0 :(得分:6)

问题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 :(得分:1)

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

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

问题2:并非我知道,您将返回浏览器之前发布过的页面,并且想知道您是否想再次(以获得与之前“相同”的结果)

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

答案 2 :(得分: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 */