1
我具备的功能如下:这是重构给定用户会话的正确方法吗?
$sid = mysql_real_escape_string($_COOKIE['session_id']);
if($sid) { session_id($sid); }
// Start session
if(!session_start()) { die('Session could not be started.'); }
$sid = session_id();
// Validate session id
$user = $this->validateSessionId($sid);
if($user) {
if(!$user['uid']) {
trigger_error('`Services->__construct()` - Could not find user by session id \''.(string)$sid.'\'.',
E_USER_ERROR);
}
$_SESSION['uid'] = $user['uid'];
$_SESSION['user_name'] = $user['name'];
$_SESSION['user_email'] = $user['email'];
$_SESSION['user_created'] = $user['created'];
}
// If no valid session id, user is anonymous
else {
$_SESSION['user_name'] = 'Anonymous';
$_SESSION['user_created'] = time();
}
当用户第一次登录时,一个cookie被创造了他们与他们当前会话的ID叫session_id
。此ID也被添加到数据库表中。我的理解是,会话最终会在客户端和服务器上到期,但是cookie和数据库条目可以设置为只要我想要的时间。
validateSessionId
检查数据库中会话ID的表格。如果会话被找到并且最近30天前还没有被访问(如果是,则从表中移除它),则来自用户列表的关联数组表示与该会话ID相关联的用户。该用户的数据将被加载到当前会话中。
我的理解正确吗?
对不起,我应该提到cookie值'session_id'是在第一次登录时存储的,并且需要在用户到期后重新组合会话。 – Hamster
是的,但是如果客户端浏览器忘记了这个cookie,那么最终会在数据库中产生一个孤儿会话记录。用户会进来,没有cookie,所以session_start()会创建一个新的会话ID。 –
嗯。解决方案是在用户再次登录时擦除表中的所有会话条目吗?他们不得不再次登录没有会话cookie ... – Hamster