我使用此代码以用户在线时的最新时间更新用户数据库:
$postTime = $user_array['last_online'];
if ($postTime == ""){
$minutes = 11;
} else {
$now = time();
$seconds = $now - $postTime; // $seconds now contains seconds since post time
$minutes = ceil($seconds / 60); // minutes since post time
//$hours = ceil($minutes / 60); //hours
}
if ($minutes > 10) {
$con = db_connect2();
$sql = "UPDATE tbl
SET last_online='".strtotime("now")."'
WHERE userid='" .mysql_real_escape_string($_SESSION['userid']). "'";
mysql_select_db('db',$con);
$result = mysql_query($sql,$con);
}
我不确定这是否是最佳方式,但我认为它有效。现在我希望使用mysql命令获取在过去10分钟内处于活动状态的所有用户。这可能吗。像
这样的东西$time = time() - 600;
$online = $conn->query("select username
from tbl
where last_online < $time");
答案 0 :(得分:2)
随着您的表填充越来越多的用户,这种查询将变得非常缓慢。我建议创建一个新表,如online
或recent_users
,每当用户刷新页面INSERT / UPDATE该表中的一行时。定期从online
表中删除时间戳大于10分钟的行。
时间不是一个你可能有索引的好列,但是年,月,日是。祝你好运!
答案 1 :(得分:2)
原始帖子中的代码实际上会加载超过十分钟前在线的用户,而不是在(小于)十分钟内。因此,我们不想检查last_online
是否少于十分钟,而是要检查它是否超过十分钟。
$time = time() - 600;
$online = $conn->query("SELECT username FROM tbl WHERE last_online >= $time");
答案 2 :(得分:1)
使用SELECT username from tbl where last_online >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)
答案 3 :(得分:0)
试试这个(假设你将last_online数据存储为unix时间戳):
select username from tbl where last_online < (UNIX_TIMESTAMP(now())-600)
答案 4 :(得分:0)
我有一种情况,我认为可以提供帮助。
实际上我使用的是表格acessPermission
,在此表格中我有Id, Ip, Page, Date
列。
我的专栏Date
是DateTime
类型,当我在报告中无需了解我的访问权限时,我只是从数据库中检索列Date
并将我分开时间,我这样比较:
数据库中的日期
$exp=explode(" ", $date);
$exp[0]; // here I have the date
$exp[1]; // here I have the time
<强>今天强>
$today = date("H:i:s"); //I have the time
减去日期
$subt = ($exp[1] - $today);
结果是只减去小时,你需要在时间戳中转换结果并再次比较我想,或者你需要检查日期,小时后,分钟后......
现在比较时间
if ($subt<600) {
block intructions
} else {
block intructions
}
我希望这可以帮助一点。
祝你好运