我正在使用数据库存储会话数据。我创建了一些函数来通过当前活动会话进行查询,并返回一些要在当前页面上使用的值。使用单个查询就可以轻松获得打开会话的数量 “从UserSessions中选择SessionData” 并返回查询返回的行数。
然后,我想确定哪些网站用户目前处于“在线”状态。会话存储正在查看网站的用户的UserID。我搜索和搜索,似乎只找到session_decode函数来解码似乎是序列化数据(但反序列化不起作用)。这里唯一的问题是,session_decode会自动填充$ _SESSION超全局。所以我的问题是,暂时存储$ _SESSION数据是否“不好”,对当前在线的每个用户使用session_decode,然后将$ _SESSION变量重置为临时存储的数据?
function getLoggedInUsers() {
//NEED SOME ERROR HANDLING AROUND DB STUFF
$oConn = DB::connect(RF_DSN);
$oPrep = $oConn->prepare("SELECT SessionData FROM UserSessions WHERE SessionData LIKE ?");
$oRes = $oConn->execute($oPrep, array("%UserID%"));
$aCurSession = $_SESSION; //STORE SESSION DATA TO RESET LATER
$aLoggedInUsers = array();
while ($oRow = $oRes->fetchRow(DB_FETCHMODE_ASSOC)) {
if ($oRow == NULL) {
break;
}
$_SESSION = array();
session_decode($oRow["SessionData"]);
$aLoggedInUsers[] = new User($_SESSION["UserID"]);
$_SESSION = array();
}
$_SESSION = $aCurSession; //RESET SESSION DATA TO CURRENT ONLINE USER
return $aLoggedInUsers;
}
在我看来,这可行,但有没有任何已知的情况,这可能会失败,然后当前用户最终会得到一些其他用户的会话数据,有效地作为可能的管理员或其他东西登录?将另一个字段存储在我的UserSessions数据库中以容纳UserID或类似的东西会更好吗?
的 的 **编辑*** 我正在尝试显示所有当前登录用户的用户名(已在站点上注册并登录)。
答案 0 :(得分:3)
我建议您在会话表中添加一列,该列在会话数据之外单独存储用户ID。这样你就可以使用SQL来获取这样的名字。 (使用假设的用户表)
SELECT UserTable.userName FROM SessionData
INNER JOIN UserTable
ON SessionData.userId = UserTable.id
假设您在预定的一段时间后使用另一个查询来清除旧会话,此查询将返回每个登录用户的当前会话数据以及包含其用户表的用户行用户名。
$_SESSION
数组只应用于存储与用户当前会话相关的信息,而不是用于存储网站周围的其他会话。
答案 1 :(得分:0)
我不会进行好的和坏的价值判断,但肯定会有更简单的方法来做到这一点。最简单的方法是只有一个数据库表,您可以在每个页面访问时使用用户ID和时间戳进行插入,并在最后15分钟左右执行COUNT(*)
。通过适当的索引,性能影响可以忽略不计
阅读您发布的一些评论,澄清您正在做的事情,您可以轻松地对会话表执行此操作。由于“在线用户”并不是真正重要,因此用户登录两次并拥有多个会话的可能性并不是那么重要。