它应该在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();
}
?>
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()
进行比较。
假设$getRow['lasthit']
包含正确的值,我认为您在这里使用了错误的公式:
if ($getRow['lasthit'] < time()+20*60) {
对于当前代码,它将始终返回true,因为time()将返回一个高于$getRow['lasthit']
的值。这个公式应该有效:
if ((time() - $getRow['lasthit']) > 20*60) {