每个用户在线和离线的PHP用户状态

时间:2016-02-18 20:54:00

标签: php pdo

我正在使用PDO处理用户状态,我遇到了一些问题。我发布了一个关于我的新问题的新问题。我创建了一个列:last_activity,当用户连接到我的网站时,我会更新它,如下所示:

if(empty($errors))
{
    $request = $pdo -> prepare("SELECT * FROM users WHERE username = :username OR e_mail = :username");
    $request -> execute(["username" => $_POST["username"]]);
    $user = $request -> fetch();
    if($user && password_verify($_POST["password"], $user -> password))
    {
        $_SESSION["signed-in"] = $user;
        $user_id = $_SESSION["signed-in"] -> id;
        $request = $pdo -> prepare("UPDATE users SET last_activity = NOW() WHERE id = ?");
        $request -> execute([$user_id]);
        $_SESSION["flash-message"]["success"] = ["Success", "You are now signed in!"];
        header("Location: account.php");
        exit();
    }
    elseif($user && !empty($_POST["username"]) && !empty($_POST["password"]))
    {
        $errors["password"] = "Votre mot de passe est incorrect.";
    }
}

这是允许您连接到网站的代码,也是更新'last_activity'的代码:

    $user_id = $_SESSION["signed-in"] -> id;
    $request = $pdo -> prepare("UPDATE users SET last_activity = NOW() WHERE id = ?");
    $request -> execute([$user_id]);

现在,last_activity将在今天用户连接的日期刷新。现在,如果用户已连接,我想显示“在线”,5分钟后,如果他不活动,则显示“离线”。如果默认情况下未连接用户,则只显示“离线”。

例如,我有一个用户列表,在每个用户名下面,我想显示FOR EACH用户的用户状态。像这样:

http://prntscr.com/a50zo5

显示所有用户名:

$request = $pdo -> prepare("SELECT username FROM users");
$request -> execute();
$users = $request -> fetchAll();

在HTML中:

<?php if($users): ?>
    <div id="users-list">
        <ul class="unstyled-list">
            <?php foreach($users as $user): ?>
                <li>
                    <a href="#" class="username"><?= $user -> username; ?></a>
                    <p>L'utilisateur est : </p>
                </li>
            <?php endforeach; ?>
        </ul>
    </div>
<?php endif; ?>

现在,如何显示每个用户名的用户状态?我试着这样做,但不可能:

$request = $pdo -> prepare("SELECT username FROM users WHERE last_activity > NOW()");
$request -> execute();
$loggedTime = $request -> fetchAll();

在HTML中:

User is: <?php if($loggedTime): ?><span class="online" style="color: green;">Online</span><?php else: ?><span class="offline" style="color: red;">Offline</span><?php endif; ?>

谢谢你,对不起英语,这不是我的主要语言。

1 个答案:

答案 0 :(得分:1)

您无需其他查询即可获取用户上次活动。在您的foreach用户中,您可以执行以下操作:

<?php echo strtotime($user['last_activity']) > time() - 300 ? 'Online' : 'Offline' ?>

如果你想要if案例,你可以这样做:

<?php if(strtotime($user['last_activity']) > time() - 300): ?>
    <span class="online" style="color:green;">Online</span>
<?php else: ?>
    <span class="offline" style="color:red;">Offline</span>
<?php endif; ?>