如何更新在线&数据库

时间:2018-03-23 11:40:09

标签: php mysqli

这几天,我正在努力,我不知道如何创建一个简单的在线& amp;我的用户的离线状态。这就是我所做的:

  • 首先,我在用户表LAST_ACTIVITY (timestamp)中创建了一个字段 和STATUS (String:Online or Offline)

  • 其次,我写了这段代码(我尝试了很多代码,这是最后一个 一,真的很困惑):

这是我的代码:

  $update_status = mysqli_query($connection,"UPDATE users SET STATUS='online',LAST_ACTIVITY=NOW() WHERE Username='{$username_session}'");
  $check_status = mysqli_query($connection , "SELECT * FROM users WHERE Username='{$username_session}'");

   while($rr = mysqli_fetch_array($check_status)) 
     {   
      if (date("Y-m-d g:i:s") > $rr['LAST_ACTIVITY'] )   
       {
           $update_status = mysqli_query($connection,"UPDATE users SET STATUS='offline',LAST_ACTIVITY=NOW() WHERE Username='{$username_session}'");
       }
     }

在此代码if (date("Y-m-d g:i:s") > $rr['LAST_ACTIVITY'] )处,我尝试在当前时间添加5分钟,然后检查当前时间(比LAST_ACTIVITY TIMESTAMP多5分钟),然后将STATUS更新为{{1}我厌倦了加上分钟:

Offline

但是没有工作,我希望你明白我的意思。请帮我解决这个问题,为我解释非常简单明了。

1 个答案:

答案 0 :(得分:0)

在这里使用timestamp会更容易。只需将当前用户的当前时间戳设置为LAST_ACTIVITY即可。为此,您需要将数据库中的LAST_ACTIVITY列更改为INT(10)

// current timestamp
$now = time();

// update current user
mysqli_query($connection, "
    UPDATE users
    SET STATUS = 'online', LAST_ACTIVITY = {$now}
    WHERE Username = '{$username_session}'");

然后只更新数据库中的所有条目,其中LAST_ACTIVITY超过5分钟。

// 60 Seconds * 5 = 300
$older = time() - 300;

// set all older entries as offline
mysqli_query($connection, "
    UPDATE users
    SET STATUS = 'offline'
    WHERE LAST_ACTIVITY < {$older}");

重置在线状态的另一种方法是直接在数据库中创建预定事件。但这对于未来的维护和清理来说并不是很好。 cron job将成为更好的解决方案。

但是,为了完成,这里有一种方法让数据库自己更新它(未经测试的):

CREATE EVENT set_offline
ON SCHEDULE EVERY 1 MINUTE
DO
  UPDATE users
  SET STATUS = 'offline'
  WHERE LAST_ACTIVITY < UNIX_TIMESTAMP() - 300;