Reputation: 221
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:
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
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