如何在会话过期后自动更新数据库而不在页面上刷新

时间:2015-05-01 13:15:00

标签: php mysql session

此代码需要刷新或点击页面才能进入索引页面,并在会话过期后更新数据库。

如何在会话过期后自动更新数据库,以便用户激活为0而无需刷新或点击页面?

$idletime = 3600; //after 1hr the user gets logged out

if (time() - $_SESSION['timestamp'] >= $idletime){
    $online = "UPDATE users SET active = 0 WHERE username = '".$_SESSION['username']."'";
    mysqli_query($con, $online);
    session_destroy();
    header("Location:index.php");
} else {
    $_SESSION['timestamp'] = time();
}

2 个答案:

答案 0 :(得分:5)

最佳选择是不在数据库中使用活动/非活动标志,而是使用类似last_active时间戳的内容。当用户访问页面时,将时间戳更新为CURRENT_TIMESTAMP()。要确定用户当前是否处于活动状态,请查询WHERE active_timestamp < TIMESTAMPADD(MINUTE, -60, CURRENT_TIMESTAMP())

确保在表格结构中将active_timestamp设置为DATETIME类型。 (ALTER TABLE users ADD COLUMN active_timestamp datetime AFTER username'

这里的问题是你的脚本看起来想要在会话空闲时踢出用户。为此,您应该查看JavaScript,设置一个倒计时超过1小时的计时器,如果没有活动,则重定向页面。

答案 1 :(得分:2)

我建议在这里使用不同的方法。 你不应该更新“活跃的”&#39;数据库中的字段。否则你会创建&#39; lastActivity&#39;数据库中的字段,每次用户在网站上执行某些操作时都会更新它。

在这种情况下,您可以通过查询数据库轻松检测哪些用户处于非活动状态:

SELECT * FROM users WHERE lastActivity < TIMESTAMP(CURRENT_TIMESTAMP() - INTERVAL 1 HOUR);

您的PHP代码如下所示:

$online = "UPDATE users SET lastActive = NOW() WHERE username = '".$_SESSION['username']."'";
mysqli_query($con, $online);