此代码需要刷新或点击页面才能进入索引页面,并在会话过期后更新数据库。
如何在会话过期后自动更新数据库,以便用户激活为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();
}
答案 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);