我正在使用数据库来存储会话数据.我创建了一些函数来通过当前活动会话进行查询,并返回一些要在当前页面上使用的值.使用单个查询就可以轻松获得打开会话的数量
“从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或类似的东西会更好吗?
**编辑***
我试图显示所有当前登录用户的用户名(已在站点上注册并登录).
解决方法:
我建议您在会话表中添加一列,该列在会话数据之外单独存储用户ID.这样你就可以使用SQL来获取这样的名字. (使用假设的用户表)
SELECT UserTable.userName FROM SessionData
INNER JOIN UserTable
ON SessionData.userId = UserTable.id
假设您在预定的一段时间后使用另一个查询来清除旧会话,此查询将返回每个登录用户的当前会话数据以及包含其用户名的用户表中的用户行.
$_SESSION数组应仅用于存储与用户当前会话相关的信息,而不是用于存储站点周围的其他会话.
标签:php,mysql
来源: https://codeday.me/bug/20190630/1332010.html