2013-03-04 83 views
3

我有一个脚本,将登录和注销用户。它完美的作品。现在我已经拥有一个小部件,可以计算注册和激活的用户数量以及有多少用户在线。我通过在我的用户数据库中有一个表示online = 1或0的字段来完成此操作。当用户登录时,online = 1并在线注销= 0.现在我没有考虑到该字段只是正在更新因为用户正在做一些事情。我没有考虑到会议超时。PHP登录/注销如果会话超时= true做某事

如何创建一个类似于会话超时= true的函数,然后更新用户在线设置= 0,其中username = $ username和user_id = $ user_id。

回答

3

在您的数据库表中,添加另一列,如last_seen。每次看到用户在线时都要更新。在一段时间不活动之后,它们将被标记为不活动。事实上,我建议你用这个替换你的online字段。

例如,

ALTER TABLE users CHANGE COLUMN `online` `online` DATETIME; -- SAMPLE SQL query only 

要检查有多少用户在线:

SELECT * FROM users WHERE online>(NOW()-INTERVAL 1 HOUR); -- SELECTS all users online in the past hour. 

如果用户注销时,你可以简单地设置online = NOW()-INTERVAL 1 HOUR。或者,您还可以保留以前的online字段,并且您可以检查用户是否闲置(使用我的建议)或online=0

+0

登录到页面更新时,用户设置了last_action = UNIX_TIMESTAMP()或DATETIME()?其中user_id = $ user_id,并在用户转到时将其添加到网站的每个页面。并在我的用户在线功能,这是来自online = 1和last_action>(UNIX_TIMESTAMP() - 3600)的用户的select count('user_id')? – 2013-03-05 19:48:00

+0

糟糕。请看我更正的答案。 UNIX_TIMESTAMP()返回一个整数,它不适用于DATETIME字段。 – rationalboss 2013-03-05 21:08:38

+0

在我检查用户是否在线的领域,如果日期在登录后过了5分钟2013-03-07 08:05:57,它会不会显示该用户? – 2013-03-07 13:07:11

3

而不是尝试使用布尔值来查看是否有人登录,请尝试使用TIMESTAMP。然后,您可以根据某人离开的时间执行更准确的逻辑。如果上次有人在您的网站上加载网页的时间是30分钟,那么您认为他们在线吗?你甚至认为他们在键盘上?

0

如果您想要,会话将只会超时。这个问题实际上是'How do I expire a PHP session?'

的重复代码仅在提供php页面时执行,所以您需要跟踪上次用户处于活动状态时使用会话变量跟踪上一次页面被送达给该用户。然后,无论何时向用户提供任何php页面,都要检查超时时间是否已经过去,如果有用户注销,请参阅link举例。

0

添加lastOnline字段,其中存储上次用户活动的时间戳。 在每个“n”秒钟更新时间戳的页面上有一些ajax功能。

要检查用户是否在线 - 同时检查:在线字段和时间戳。如果时间戳记的更新时间超过“n”秒 - 即使在线字段等于1,用户也不在线。