2011-11-16 40 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

相關問題