Uptop 14
Uptop 14

Reputation: 221

PHP user status online and offline for each user

I'm working on a user status using PDO and I have some problems. Im posting a new question about my new problem. I created a column: last_activity and I update it when the user connects to my site, like this:

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.";
    }
}

This is the code which allows you to connect to the site, but also to update 'last_activity':

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

Now, the last_activity is refreshed with today's date when the user connects. Now, I would like to display "Online" if user is connected and after 5 minutes, put "Offline" if he is not active. If user is not connected by default, just display "Offline".

Example, I have a users list and below each username, I would like to display the user status FOR EACH user. Like this:

http://prntscr.com/a50zo5

To display all usernames:

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

And in the 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; ?>

Now, how can I display the user status for each username? I tried to do something like this, but impossible:

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

In the 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; ?>

Thank you and sorry for the English, it's not my main language.

Upvotes: 1

Views: 1911

Answers (1)

Chin Leung
Chin Leung

Reputation: 14921

You don't need another query to get the user last activity. In your foreach users, you could do:

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

In case you want the if case, you could do:

<?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; ?>

Upvotes: 1

Related Questions