我正在使用数据库来存储我的会话数据。我创建了一些函数来查询当前的活动会话并返回一些要在当前页面上使用的值。使用像“SELECT SessionData FROM UserSessions”这样的单个查询并返回查询返回的行数似乎很容易获得打开的会话数。
然后,我想确定哪些站点用户当前“在线”。会话存储正在查看网站的用户的用户 ID。我搜索了又搜索,似乎只找到了用于解码似乎是序列化数据的 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 或类似的东西会更好吗?
**编辑*** 我正在尝试显示所有当前登录用户(已在网站上注册并登录)的用户名。