将用户登录-注销时间存储到数据库中有所不同
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 中以前的会话?