我是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);
功能,正如其他问题所示,但我仍然有随机结果。如果我不能正确地尝试创建登录系统,我认为这不是一个好主意......