为什么我的会话超时注销不起作用?

时间:2013-08-30 20:38:05

标签: php session-timeout

它应该在20分钟不活动后退出但是在3-4秒后退出,我不知道我哪里出错了。我知道其他问题在那里,但我看了,找不到修复。

<?php

session_start();
if ((isset($_SESSION['Username']) && $_SESSION['Username'] != "") || (isset($_SESSION['uID']) && $_SESSION['uID'] != "") || (isset($_SESSION['Password']) && $_SESSION['Password'] != "")) { 

$selectUsers = $PDO->query("SELECT * FROM `users` WHERE uID='{$_SESSION['uID']}'");
$getRow = $selectUsers->fetch(PDO::FETCH_ASSOC);

if ($getRow['lasthit'] == time()+20*60) {
session_destroy();
session_unset();
$PDO->query("UPDATE `users` SET online=0 WHERE uID='{$_SESSION['uID']}'");
header("Refresh:3; URL=login.php");
} else {
$updateLastHit = $PDO->query("UPDATE `users` SET lasthit=NOW() WHERE uID='{$_SESSION['uID']}'");    
}  


} else {
header("Refresh:3; URL=login.php");
echo '<p class="error">You need to login, you are being redirected to login page.</p>';
endPage();
}

?>

2 个答案:

答案 0 :(得分:0)

假设$getRow['lasthit']包含正确的值,我认为您在这里使用了错误的公式:

if ($getRow['lasthit'] <  time()+20*60) {

使用当前代码,它将始终返回true,因为time()将返回高于$getRow['lasthit']的值。这个公式应该有效:

if ((time() - $getRow['lasthit']) >  20*60) {

答案 1 :(得分:0)

if ($getRow['lasthit'] == time()+20*60) {

应该是:

if ($getRow['lasthit'] < time()-20*60) {

您正在寻找完全匹配,而且您还要添加而不是减去。

将SELECT查询更改为:

$selectUsers = $PDO->query("SELECT UNIX_TIMESTAMP(lasthit) lasthit FROM `users` WHERE uID='{$_SESSION['uID']}'");

这样它将返回一个整数,而不是一个时间戳,你可以将它与PHP的now()进行比较。