如何管理PHP会话的生命周期?

时间:2015-12-14 18:34:48

标签: php session cookies lifetime cache-expiration

我是PHP的新手,所以我正在开发一个简单的项目来练习。但是,我无法使会话管理正常运行。

我想要的是,当浏览器关闭时,数据(用户所在的当前页面)将保存一小时。如果用户在一小时内返回,他应该看到他离开的同一页面,如果他在一小时后返回,他应该看到第一个问题。

当所有问题都得到回答后,他应该会看到一个分数屏幕,其中“再试一次”按钮最好会破坏/杀死/删除会话并启动一个新会话,将用户引导到第一个问题。

如果我遗漏第3-8行,我的代码按预期工作,我会一直运行这些问题,直到我被一个不工作的“再试一次”按钮卡在分数屏幕上,我只能回到第一个关闭并重新打开浏览器的问题。

使用这些行,页面可以很好地解决问题,但是当我重新启动浏览器时,它会从第一个问题开始。当我关闭浏览器而不做任何事情并再次打开页面时,我找到了我最初离开的页面。我再次关闭并打开浏览器,我再次找到正确的页面,我再次执行此操作,然后回到问题0。无论我多久重新启动浏览器,我都会留下问题0。

当我在浏览器中查看cookie时,我始终拥有相同的cookie,从2015年12月14日18:48:45开始。然而,考试时间也不正确,因为那是2061年11月26日13:37:29,而不是一小时之后。我做错了什么?

这是我的代码:

<?php
/* Sart (new) session*/
if (isset($_GET['TryAgain'])){
    session_start();
    $_SESSION = array();
    session_destroy();
}
session_set_cookie_params(time()+3600);
session_start();
/*-------------------------------------------------------------------*/

/* IMPORT DATABASE: $qs[i]=question text, $as[i]=array(choices per question),
$as[i][i]=array('t'=>choice text, 'c'=>BOOLEAN) */
require_once('config.php');
$dbh = new PDO("mysql:dbname=$db;host=$host", $user, $password);
$questions = $dbh->prepare('select * from questions');
$questions->execute();
$choices = $dbh->prepare('select * from choices');
$choices->execute();
$qs = array();
$as = array();

foreach($questions as $row) {
    $i = $row['q_nr'];
    $qs[$i] = $row['q_text'];
}

foreach($choices as $row) {
    $qi = $row['q_nr'];
    $ci = $row['c_nr'];
    $as[$qi][$ci] = array('t'=>$row['c_text'],'c'=>$row['correct']);
}
/*-------------------------------------------------------------------*/
/*INITIALIZE SESSION VARIABLES*/

/* Creates counter-variable if not set -------- (ini value is 0)*/
if(!isset($_SESSION['counter'])) {
    $_SESSION['counter'] = 0;
}

/* Creates score-variable if not set -------- (ini value is 0)*/
if(!isset($_SESSION['score'])) {
    $_SESSION['score'] = 0;
}
/*-------------------------------------------------------------------*/
/* SET COUNTER, SCORE AND DONE*/

/* Check if answer previous question has been submitted*/
if (isset($_GET['a'])) {
    $submitted = true;
} else {
    $submitted = false;
}

/* Set counter*/
if ($submitted){
    $_SESSION['counter'] += 1;
}
$cqi = $_SESSION['counter'];

/* Set score*/
if ($submitted) {
    if ($as[$cqi-1][$_GET['a']]['c']){
        $_SESSION['score'] += 1;
    }
} 
$score = $_SESSION['score'];

/* Check done*/
if($cqi >= count($qs)){
    $done = true;
} else {
    $done = false;
}

echo 'cqi: '.$cqi;
echo 'done: '.$done;
/*-------------------------------------------------------------------*/
?>

<!-- START HTML!!! -->

<html>
    <head>

    </head>
    <body>
    <br><br>
    <?php 
        if($done){
            echo 'You finished the quiz. <br> Your score is: '.$score;
            echo "<form action='index.php' method='get'>";
            echo "<input type='hidden' name='TryAgain' value=true>";
            echo "<input type='submit' value='Try again!'>";
            echo "</form>";
        } else {
            echo $qs[$cqi];
            echo "<form action='index.php' method='get'>";
            $cci = 0;
            foreach($as[$cqi] as $cc){
                echo "<input type='radio' name='a' value=".$cci.">".
                $cc['t']."<br>";
                $cci++;
                }
            echo "<input type='submit' value='Next question'>";
            echo "</form>";
            echo "<br><br>Current score: ".$score;
        }
    ?>
    </body>
</html>

请帮助我,我真的很困惑。

- 编辑 -

我再次尝试省略第3-8行并保留session_set_cookie_params(600);,以尽可能简单地测试此功能。我按照上面引用的方式测试它,一次又一次地重新打开我的浏览器并记下我得到的问题(q.0或1)。我有一个看似随机的模式,第一个问题0和我应该问的问题,1,其中0通常是最普遍的。我很确定它是随机的,因为我删除了cookie并多次重复测试,每次我看到不同的模式。 Cookie 现在会在正确的时间到期。

我也尝试了ini_set('session.cookie_lifetime', 600);而不是session_set_cookie_params(600);功能,正如其他问题所示,但我仍然有随机结果。如果我不能正确地尝试创建登录系统,我认为这不是一个好主意......

0 个答案:

没有答案