2010-08-21 103 views
3

我在這裏對於應該如何處理會話存在一些疑慮。使用PHP會話ID,cookie +數據庫跟蹤用戶

現在,我有一個MySQL數據庫,其中「users」表有一個session_id字段。如果爲NULL,用戶沒有登錄?如果該值與PHPSESSID cookie的值相同,則會比用戶登錄的值更大。

我不知道爲什麼,但我總覺得這不夠好,以確保哪個用戶是我的正在處理。有什麼我想念的,或者我的恐懼沒有根據?

回答

2

就我所知,您描述的內容沒有任何實質性錯誤。

當然,登錄和註銷機制需要在登錄或註銷時可靠地添加和刪除用戶標識。 (僅在密碼匹配時插入用戶名等)。此外,過期的會話需要可靠地移除。如果這是給出的,這應該沒問題。

+0

是的,註銷包括銷燬會話cookie並將會話字段設置爲NULL,以及銷燬服務器端會話。 – KdgDev 2010-08-21 22:01:30

2

只是Pekka說的擴展,你也可以在你的表中包含一個'last seen'字段並用它作爲判斷,因爲Pekka提到過期會話時,你的數據庫不會被告知他們已經不在了。所以你將不得不做一些事情,以便手動檢查用戶最後一次在那裏或者沿着這些線路做什麼,然後將它映射回會話超時(我相信這對於PHP來說默認是15-30分鐘),並且然後在所述時間量之後,清除在最近X分鐘內沒有活動的任何用戶。

1

想到上述選項 - 跟蹤用戶表中的用戶只會允許每個用戶1個會話。我建議將數據存儲在稱爲會話的表格中,並具有以下列:

sess_id | sess_userid | sess_ipv4 | sess_lastseen(datetime/timestamp)| sess_sessionid(varchar)

我相信這將允許用戶有多個登錄名,但具有不同的會話ID,即使他們共享相同的公共IP,允許筆記本電腦,平板電腦,手機等 - 這樣你可以跟蹤每個設備與單個用戶分開。

希望這有助於!

上週讀過的另一篇文章建議做一個prevsession和currsession,並確保你將一個新的會話(每15分鐘?)分配給正確的用戶。 。將會話從舊的交換到新的會話並將prev會話存儲爲支票 - 不知道這是否會有所幫助,但認爲id會提及它。