2010-10-31 26 views
0

我用这个代码与最新的时间来更新用户数据库,当用户处于联机:选择在线用户数据库与MySQL命令

$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

你的代码有什么问题? – 2010-11-06 07:10:45

+0

它在10分钟前获得了在线用户,这不是我们想要的结果(我们希望用户在线时间不到10分钟)。看到我的答案。 – defines 2010-11-10 01:25:47

+0

对于'$ online'查询,Dustin Fineout在下面指出了'<' ->'> ='。也就是说,不是'... last_online <$ time ...'使用'... last_online> = $ time ...'。 – 2010-11-11 08:06:04

回答

2

原始帖子中的代码实际上会加载超过十分钟前在线的用户,而不是在(小于)十分钟之内。因此,我们不想检查last_online是否少于10分钟前,而是要检查它是否大于10分钟前。

$time = time() - 600; 
$online = $conn->query("SELECT username FROM tbl WHERE last_online >= $time"); 
1

使用SELECT username from tbl where last_online >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)

+0

看起来不错,但不能完全得到它的工作 – ganjan 2010-11-01 01:53:16

+0

好的......出了什么问题? – 2010-11-01 02:02:01

+0

我用strtotime(“now”)更新last_online,但查询返回一个空的结果集(即零行)。 – ganjan 2010-11-01 13:33:59

0

东西试试这个(假设你存储last_online数据作为UNIX时间戳):

select username from tbl where last_online < (UNIX_TIMESTAMP(now())-600) 
+0

这还会加载超过10分钟前在线的用户,而不是在过去十分钟内。 – defines 2010-11-10 01:36:47

2

当你的表填充了越来越多用户的这种查询将变得非常缓慢。我建议创建一个像onlinerecent_users这样的新表,并且每当用户刷新页面时,INSERT/UPDATE表中的一行。定期删除online表中时间戳超过10分钟的行。

时间不是你可能有索引的好列,但是年,月,日是。祝你好运!

+0

为什么要添加所有这些开销?时间戳(整数)作为索引有什么问题?这是数字比较 - 排序并不容易。 – defines 2010-11-10 01:36:09

+0

有什么不对?他们几乎都是独一无二的。将索引视为拇指的电话簿页面剪切。如果你对没有分组的东西进行索引 - 它不是非常有用,因为搜索索引需要搜索实际数据(除非它是一个字面唯一索引或主键) – Mikhail 2010-11-11 17:36:10

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 

今天

日期

减日期

$subt = ($exp[1] - $today); 

结果是唯一的,你需要在一个时间戳转换结果,并再次进行比较,我认为,或者你需要检查的日期时间的减​​法,在这一小时后,在分钟后..

现在比较时

if ($subt<600) { 
block intructions 
} else { 
block intructions 
} 

我希望这可以帮助一点。

好运