我有Laravel应用程序,我每3秒钟定期检查一次用户的心跳登录状态(演示目的,实际上是5分钟)。对于每个节拍,我都会检查用户在当前时间的上一次事件是否也为5分钟。如果是这样,请注销它们。

这是我的代码:

$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->where('last_activity','>=',"now() - interval 5 minute")->get();

    if(!empty($result))
        return Redirect::to('/logout');
    else
        return Response::json('still-alive');

我的问题是,这行不通。如果我将操作数更改为<=,它将在5分钟前立即将我注销,如果操作数是>=,即使5分钟后它也不会注销我,有人可以解释为什么吗?

-编辑-

感谢您提供所有答案,我通过将代码修改为以下方式解决了我的问题:
$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->first();

    if(!empty($result))
        if(strtotime($result->last_activity) < strtotime("-5 minutes"))
            return Redirect::to('/logout');
        else
            return Response::json('still-alive');
    else
        return Response::json('no-record');

最佳答案

假设您的业务逻辑正确,请尝试在where子句中使用PHP代替SQL字符串:

$date = new DateTime;
$date->modify('-5 minutes');
$formatted_date = $date->format('Y-m-d H:i:s');

$result = DB::table('db_user')->where('id_user','=',Session::get('id_user'))->where('last_activity','>=',$formatted_date)->get();

另外,最好始终输出已执行的SQL查询,以确保Laravel的行为符合预期,这是一个好习惯:
$queries = DB::getQueryLog();

关于php - Laravel选择5分钟以上的记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19475896/

10-13 06:47