使用mysql命令从db中选择在线用户

时间:2010-10-31 23:53:30

标签: php mysql time timer

我使用此代码以用户在线时的最新时间更新用户数据库:

$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"); 

5 个答案:

答案 0 :(得分:2)

随着您的表填充越来越多的用户,这种查询将变得非常缓慢。我建议创建一个新表,如onlinerecent_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列。

我的专栏DateDateTime类型,当我在报告中无需了解我的访问权限时,我只是从数据库中检索列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
}

我希望这可以帮助一点。

祝你好运