0

我有一个包含$_SESSION变量的页面。现在经过一定时间后,所有会话都将过期,这很公平。但问题是,我们突然收到关于 $_SESSION 变量的未定义通知,因为它们现在已过期。

因此,在这种情况下,会话到期时最好做的事情是什么。我们是否只包含E ^ NOTICE代码以不显示通知(在我们知道页面完全完整且没有错误之后),或者我们是否希望销毁session_destroy()页面上使用的会话,或者是否有其他方式不显示这些未定义的错误给正在浏览器上查看这些页面的用户,并且可以在会话到期时查看该页面。

下面是关于如何显示 $_SESSION 代码的示例代码:

 <?php

    ini_set('session.gc_maxlifetime',12*60*60); //12 hours until session expires
    ini_set('session.gc_divisor', '1');
    ini_set('session.gc_probability', '1');
    ini_set('session.cookie_lifetime', '0');
    require_once 'init.php'; 

    session_start();  //starts sessions

    include('member.php');  //this php script also contains sessions


    if (isset($_POST['id'])) {

    $_SESSION['id'] = $_POST['id'];

    }


    if(isset($_POST['sessionNum'])){
                //Declare my counter for the first time

                $_SESSION['initial_count'] = $_POST['sessionNum'];
                $_SESSION['sessionNum'] = intval($_POST['sessionNum']);
                $_SESSION['sessionCount'] = 1;

        }

    if (isset($_POST['submitDetails']) && $_SESSION['sessionCount'] < $_SESSION['sessionNum']) {
        $_SESSION['sessionCount']++;
    }


    $sessionMinus =  $_SESSION['sessionCount'];


    if (isset($_POST['textQuestion'])) {

    $_SESSION['textQuestion'] = $_POST['textQuestion'];

    }

    if (isset($_POST['textMarks'])) {

    $_SESSION['textMarks'] = $_POST['textMarks'];

    }

    if (isset($_POST['totalWeight'])) {

    $_SESSION['totalWeight'] = $_POST['totalWeight'];

    }

    if ($sessionMinus == $_SESSION['initial_count']){ 

        $action = 'individualmarks.php'; 

    }elseif($sessionMinus != $_SESSION['initial_count']){ 

        $action = $_SERVER['PHP_SELF']; 

    }

    ?>
4

3 回答 3

3

isset()您可以像使用 $_POST 变量一样检查功能,并且通知将消失

于 2013-01-11T15:03:37.773 回答
1

检查是否存在特定的哨兵值。例如,如果您对会话所做的任何事情都是针对受登录保护的系统,那么请检查 isset($_SESSION['loggedIn']) && ($_SESSION['loggedIn'] == true).

如果哨兵值不存在,那么会话发生了一些事情,您应该将用户重定向到其他地方以将事情恢复到应有的方式(例如显示登录页面)。

由于您无法提前知道“慢”用户会点击哪个页面,因此您必须假设会话随时可能消失,并在每个页面上进行哨兵检查。

于 2013-01-11T15:05:32.720 回答
1

首先,在实时站点中,您将需要 error_reporting(0),因此您不会看到通知。

如果您不想再看到通知,则还需要检查数组键。你通过使用检查if(isset($_SESSION['some_key']))

完成此操作后,您可以安全地使用该变量。

于 2013-01-11T15:06:47.750 回答