将用户登录-注销时间存储到数据库中有所不同

Posted

技术标签:

【中文标题】将用户登录-注销时间存储到数据库中有所不同【英文标题】:Storing user login-logout time into database with it's difference 【发布时间】:2013-11-26 15:44:35 【问题描述】:

我想在我的网站上存储用户的登录历史记录。

表:

mysql> desc user_stat;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | varchar(64) | YES  |     | NULL    |       |
| login  | varchar(64) | YES  |     | NULL    |       |
| logout | varchar(64) | YES  |     | NULL    |       |
| diff   | varchar(64) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

当用户登录时,我执行插入。

insert into user_stat(id,login) values('".$id."','".NOW()."');

但是对于注销的情况很混乱。由于用户可能已经在两个差异浏览器中登录了两次。那么如何维护logout时间呢?诸如会话管理之类的东西(尽管我没有使用会话变量进行登录注销)。我使用的用于登录注销的 JS sdk:http://jsfiddle.net/YCFpH/

另外,我如何在diff 列中获取注销和登录时间的差异?

一种方法是将数据时间字符串转换为数字并获取它的差异。但我不知道那种方法。

数据时间差异的任何其他解决方案?

【问题讨论】:

这可能会有所帮助:php.net/manual/en/datetime.diff.php 你也可以使用从***.com/a/10792045/1415724和***.com/a/12386749/1415724获取/找到的BETWEEN 至少,您的登录/注销列应该是时间戳/日期时间;您不希望每次查询该表时都进行转换。并且请避免使用BETWEEN with timestamps - 由于默认秒数(但精度可以更高!),MySQL 只能获得一些通过。考虑注销退出的更好方法可能是:如果您记录状态更改,则只需要下一个状态的开始 - ergo,注销时间也是新的登录时间。 【参考方案1】:

但是对于注销的情况很混乱。由于用户可能已经在两个差异浏览器中登录了两次。那么如何维持注销时间呢?

每个登录必须有某种会话标识符。否则,您将永远无法正确关联您的注销时间和正确的登录时间。有很多方法可以得到这个,这取决于你的网络服务器平台。至少,您可以在客户端创建一个 uid(请参阅 Create GUID / UUID in javascript? )并在用户注销时传递该 uid。

此外,如果您不按差异时间排序或加入,则登录和注销可能是日期时间数据类型,并且每次您需要时都会计算差异而不是存储差异。例如。

    set @time1 = now();
    set @time2 = date_add(now(), interval 30 second);

    select @time1, @time2, (timediff(@time1,@time2))

现在你得到了以秒为单位的时间差。

2013-12-26 14:17:32 2013-12-26 14:18:02 -00:00:30

【讨论】:

以上是关于将用户登录-注销时间存储到数据库中有所不同的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 会话数据在注销/登录后仍然存在,即使对于不同的用户也是如此

如何处理登录注销

如何从管理员端注销所有活动的登录用户

如果用户忘记注销并关闭浏览器,如何删除 Rails 中以前的会话?

在 YII2 中使用自动注销,需要在再次登录后将用户重定向到用户在自动注销之前的相同 URL

如何在php中检测用户是不是已注销?