2013-07-29 85 views
2

我的網站使用會話進行用戶登錄,我想有顯示用戶多臺計算機是如何登錄到他們的賬戶(如Gmail做什麼)每個頁面上的消息。

例如,如果它們都記錄在兩個不同的計算機上,我想消息說:

You are logged in on 2 computers. 

我知道如何檢查自己是否登錄 - 我只是檢查$_SESSION['username']變量如果它被設置,那麼他們在該計算機上登錄。但是我怎樣才能檢查是否在其他會話中設置了相同的username(表示它們已在其他計算機上登錄)?

+1

否。通過數據庫管理您自己的會話。 (1.生成隨機字符串,2.將其設置爲cookie,3。將它保存在數據庫中,使用引用的表(user_id-> id)) –

+0

您需要將會話數據存儲在數據庫中。 – rtimoshenko

+1

@DaveChen - 如果用戶檢查複選框以保持登錄狀態,我確實會存儲cookie,但是如果我在數據庫中存儲了某些用戶僅使用會話進行登錄(即無持久登錄)的情況,那麼如何更新數據庫何時會話結束?沒有辦法知道會話何時結束,對吧? – Nate

回答

2

這是很難與基於默認的文件PHP會話執行。默認情況下,PHP只是將會話信息存儲在文件系統文件中的不透明blob中,文件名稱爲會話ID。您無法直接訪問這些文件中的數據,而無需逐一打開並評估它們。

你需要的是將這些信息轉移到一個數據庫中。要麼只存儲數據庫中的併發登錄數並按原樣保存其他會話,但很難保持同步。切換到會話的完整數據庫後端代替基於文件的存儲會更好。這使您可以透明地查詢會話中的任何數據,包括輕鬆獲取有關用戶擁有多少會話的統計信息。

2

你會想會話數據存儲在數據庫中。然後,您可以查詢數據庫是否有多個具有相同ID的用戶。

+1

有用的代碼片段存儲會話在數據庫 - http://phpsecurity.org/code/ch08-2 –

0

剛剛創建的用戶表登錄計數一個額外的列。當用戶登錄到服務器1個計數增加列當用戶註銷與1數減少...

通過會話都爲每個瀏覽器創建的方式..你不能訪問其他會話變量會話

+0

如何做你處理自動垃圾收集會話......? – deceze

1

注:我不會逃避例子中的數據,但你需要做的與庫MySQLi或PDO

像這樣的一些列創建一個表logged_in_users或類似的東西:

create table logged_in_users(
    user_id int unsigned, 
    login_date datetime, 
    hash_key char(32), 
    unique key user_hash_key(user_id, hash_key) 
); 

當用戶登錄時,刪除舊記錄,然後添加新的成員如下:

$hash_key = md5(time().uniqid().rand(0,1000)); // Create a unique key 
$_SESSION["hashkey"] = $hash_key; 

// Remove the inactive members (this uses 10 minutes) 
delete from logged_in_users where login_date > date_sub(now(), interval 10 minute); 

// Add the user 
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key'); 

而當用戶加載頁面,你應該檢查,看看用戶是否仍然有記錄,並插入一個當你想知道有多少人都記錄在

$hash_key = $_SESSION["hashkey"]; 
insert ignore into logged_in_users (user_id, login_date, hash_key) values (123, now(), '$hash_key'); 

然後,你會做這樣的事:如果他/她不喜歡這個

// Total people for a particular member 
select count(*) as total from logged_in_users where user_id = 123; 

// Total people logged in 
select count(*) as total from logged_in_users; 

// Total members logged in (not people) 
select count(distinct user_id) as total from logged_in_users; 

最後當用戶註銷時,像這樣刪除它們:

$hash_key = $_SESSION["hashkey"]; 
delete from logged_in_users where user_id = 123 and hash_key = '$hash_key';