2011-11-16 74 views
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相关联的用户。该用户的数据将被加载到当前会话中。

我的理解正确吗?

回答

1

整个session_id()业务都可以避免。当您调用session_start()时,PHP将自动检查会话cookie的存在,并在此时检索会话的ID。你只是复制了已经为你做的事情。

您的代码假设PHP发送的cookie用于跟踪会话实际上是永久性cookie。通常PHP只发送会话cookie(例如,当浏览器关闭时删除)。因此,用户在返回网站时不会有任何会话cookie,并且每次都会获得全新的会话。

+0

对不起,我应该提到cookie值'session_id'是在第一次登录时存储的,并且需要在用户到期后重新组合会话。 – Hamster

+0

是的,但是如果客户端浏览器忘记了这个cookie,那么最终会在数据库中产生一个孤儿会话记录。用户会进来,没有cookie,所以session_start()会创建一个新的会话ID。 –

+0

嗯。解决方案是在用户再次登录时擦除表中的所有会话条目吗?他们不得不再次登录没有会话cookie ... – Hamster

相关问题