聽起來你想要做的就是跟蹤哪些用戶處於活動狀態以及哪些用戶處於非活動狀態。如果是這樣,你會以不必要的困難方式去解決它。
而不是通過發送1和0來打開或關閉online
,在您的數據庫中有一個timestamp
字段會更好,該字段在用戶與您的應用程序交互時更新。下面是使用一個單獨的表爲例(因爲我看不到你的架構):
CREATE TABLE user_activity (
user_id INT UNSIGNED,
last_active TIMESTAMP,
PRIMARY KEY (user_id)
);
每當你的用戶提供數據庫,問題互動查詢,如:
INSERT INTO user_activity (user_id, last_active)
VALUES (?, NOW())
ON DUPLICATE KEY UPDATE last_active = NOW();
的?
符號是您將從MySQL Improved Extension或PHP Data Objects interface for MySQL提供給相應功能的user_id
參數的佔位符,具體取決於您決定在您的PHP代碼中使用哪一個參數。
然後才能確定是否有人在網上或沒有考慮,你會發出這樣的詢問:
SELECT last_active FROM user_activity WHERE user_id = ?;
,並使用時間戳返回到做決定。
請注意,這種方法也可以以不同的方式實現;您可以決定將偏移量時間戳存儲在數據庫中,以表示當用戶將被視爲在線時的最後一點。就我個人而言,我不希望在我的數據庫中存儲衍生數據。我總是可以在數據庫之外派生它,但是如果我改變應用程序的工作方式或爲不同的用戶提供不同的會話超時策略,我可能無法恢復關於用戶的有意義的信息(它們確切的時間是上次激活的)從這個派生的「到期日期」字段。
您也不必將此信息存儲在單獨的表中;將其存儲在保存一般用戶數據的表格中可能更合適。但是,如果將它存儲在單獨的表中,則應該將user_activity.user_id
定義爲用戶數據表的外鍵。
來源
2014-10-03 16:37:06
Air
你可以分享你所嘗試過的嗎? – 2014-10-03 16:10:51
你可以試着改變你如何驗證活動,存儲它們何時到期的時間戳(例如,現在+ 10分鐘),並且每次他們在應用程序中執行某些操作時,都會像以前一樣更新該字段(現在爲+10分鐘)。您只需檢查該時間戳是否已過期=不再處於活動狀態。 – mr12086 2014-10-03 16:21:15
謝謝mr12086!你給了我一個好主意! – aleknx1000 2014-10-03 16:28:55