Bonjour,
Voila je rencontre un petit problème avec mon code.
J'essaye de faire en sorte de voir a travers un profil si un utilisateur est en ligne ou pas, j'ai crée un champ "last_activity" en TIMESTAMP , et avec une requete :
$bdd->prepare("UPDATE users SET last_activity = CURTIME() WHERE id = ?")->execute([$_SESSION['id']]);
faire un update sur last_activity .
Je veux faire en sorte qu'a chaque visite d'une page par l'utilisateur , le champ last_activity soit mis à jour et si il n'a pas visité de page d'ici les 15minutes il est considéré comme hors ligne sinon il est bien ligne
Bonsoir.
@Mikachu: Je crois bien que tu n'as pas compris ce qu'il veux, il ne souhaite pas déconnecter un utilisateur s'il n'est pas actif depuis plus de 15 minutes, mais faire en sorte que s'il ne l'est pas, de mettre à jour un champ en base de données, surtout qu'utiliser uniquement la session ne l'aidera pas dans son contexte, vu qu'il veut que d'autres utilisateurs puissent savoir si l'utilisateur du profil qu'ils consultent est en ligne ou non.
Actuellement, j'ai crée le champ dans ma db "last_activity" en TIMESTAMP et j'ai ma requete pour update
Si le champ en base de données est de type timestamp, c'est une mauvaise idée de lui mettre une valeur égale à 0, tu devrais plutôt créer un champ de type boolean qui pourra donc être égale à 0 ou 1, soit par exemple un champ nommé online, qui aurait pour valeur 1 s'il est considéré comme être en ligne ou 0 dans le cas contraire, puis tu garde ton champ last_activity pour y stocker le timestamp de sa dernière activité.
Donc ton update sur le champ last_activity tu peux le garder comme ça, par contre il te faut un système supplémentaire, comme par exemple comme le propose Thomas Chicheportiche de faire une tache CRON, pour que ton serveur fasse un update dans la table des utilisateurs, dans lequel tu définierais la valeur du champ online à 0 pour tous les utilisateurs qui ont comme valeur du champ last_activity un timestamp inférieur au timestamp actuel moins 15 minutes en ajoutant bien sur en condition que le champ online ne soit pas déja à 0.
Par contre, des sujets pour ce genre de système a déjà été posté plusieurs fois, par exemple :
Et je ne t'en site que quelques-un là.
Par contre, précises bien aux autres utilisateurs, que c'est plus ou moins subjectifs et que ce n'est basé que d'après la dernière activité de l'utilisateur concerné (quelque chose du genre).
Salut,
Si j'ai bien compris, à chaque action de ton user, tu execute cette requête?
Dans ce cas tes users hors ligne correspondrant aux user dont le last_activity < CURTIME()-900. (900 = 60 x 15)
Enfaite pour mon systeme j'essaye de faire un cas d'utilisation comme celui ci :
Actuellement, j'ai crée le champ dans ma db "last_activity" en TIMESTAMP et j'ai ma requete pour update
$bdd->prepare("UPDATE users SET last_activity = CURTIME() WHERE id = ?")->execute([$_SESSION['id']]);
Mais je seche un peu dans la mise en place.
Je suppose que si tu as des users, tu as un système te permettant de check l'authentification de celui-ci.
On peut imaginer que si ton check d'authentification est ok tu mets à jour ton champ.
C'est pas ça le souci , faire un cas pour update un champ lorsqu'il se log et se delog, c'est pas le problème mais si il ferme le navigateur sans se delog avec le bouton , le systeme ne sait pas qu'il c deconnecté , c'est pourquoi je fais ce cas.
Dans ce cas la tu peux utiliser une tache plannifiée ou tache cron de manière à executer un script qui va mettre ton champ à 0 toutes les x minutes si la dernière activité est à plus de 15min.
Et stocker last_activity en session ou cookie, et le mettre à jour à chaque besoin ?
Ainsi plus besoin de faire de requete, juste tu mets à jour $_SESSION["User"]["last_activity"] à chaque chargement de pages. Et si last_activity+15min est inférieur à NOW(), tu déconnecte, ou fais l'action adéquate à la desactivation
Bah au lieu de faire ta requète tu set en session la valeur last_activity, exemple:
// A la toute premiere connexion, au moment du isLogged par exemple, faire:
$_SESSION["User"]["last_ativity"] = strtotime(date("Y-m-d H:i:s"));
// Au chargement d'une page lancer une fonction, ou mettre dans une class et l'appeler au bonne endroit.
// Fonction exemple de type par exemple:
function checkLastActivity() {
$now = strtotime(date("Y-m-d H:i:s"));
$lastActivity = strtotime("+15 minutes", $_SESSION["User"]["last_ativity"]);
if($lastActivity < $now) {
session_destroy(); // Si inférieur tu détruit la session, ou appel ta méthode logout()
} else {
$_SESSION["User"]["last_ativity"] = $now; // Sinon réaffecte $now a last_activity de la session
}
}
Ca reste sommaire et à froid comme ca, mais voila l'idée. Pas sure que cela fonctionne tel quel. Reste à affiner selon ton code.
alors dans ma fonction log :
function logged_only() {
if(session_status() == PHP_SESSION_NONE) {
session_start();
$_SESSION["username"]["last_activity"] = strtotime(date("Y-m-d H:i:s"));
var_dump($_SESSION["username"]["last_activity"]);
}
if (!isset($_SESSION['auth'])) {
$_SESSION['flash']['danger'] = "accès refusé";
header('Location: login.php');
exit();
}
}
le var_dump me renvoit un int " int(1487287447) " , c'est normal?