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