Page 1 sur 2

Afficher icone selon statut ONLINE/OFFLINE

Posté : 04 août 2007, 17:02
par Tyrese
Bonjour à tous,

Je suis en train de me pencher sur l'affichage d'icone selon les statuts des gens qui arrivent sur mon site. Je m'explique.

Il y a une liste d'utilisateur sur mon site. J'aimerais que lorsque ces utilisateurs se connectent en se logant, leurs statuts soient affichés par une icone différente si ils sont online ou offline. Cependant, je n'y arrive pas :(

La table des utilisateurs se prénomme "users" mais je n'ai pas de colonne pour spécifier leur statut. Je pense que le problème vient de là, mais ça dépasse mes compétences, c'est pourquoi je me tourne vers vous pour m'expliquer les manips :)

Posté : 04 août 2007, 17:15
par Tyrese
Ah oui, j'oubliais, voici mon formulaire de connexion.
<?php if(!$_SESSION["dpteam"]) {
echo "<form action='?p=logon' method='post'>
<table border='0' cellspacing='0' cellpadding='0'>
                            <form name='loginform' action='' method='post'>
                              <tr>
                                <td><input onFocus=\"this.style.backgroundImage='url(img/username_hover.jpg)';\" onBlur=\"if(this.value==''){this.style.backgroundImage='url(img/username.jpg)'};\" name='pseudo' type='text' class='username' value=''></td>
                                <td><input onFocus=\"this.style.backgroundImage='url(img/password_hover.jpg)';\" onBlur=\"if(this.value==''){this.style.backgroundImage='url(img/password.jpg)'};\" name='mdp' type='password' class='password' value=''></td>
                                <td><input type='image' src='img/ok.jpg' valign='middle' border='0' name='submit' alt='Go'>                                  
                                <img src='img/panel.jpg' border='0' usemap='#Map2Map'></td>
                              </tr>
                              </form>
                            </table>
                            <map name='Map2Map'>
                              <area shape='rect' coords='13,-1,125,7' href='?p=recpass'>
                              <area shape='rect' coords='50,10,123,19' href='?p=register'>
                            </map></td></tr>
                           ";
						    } else {
echo "<table border='0' cellspacing='0' cellpadding='0' width='380' height='29'>
                           <tr>
                                <td class='Style2'><div align='right'>You are now logged in.</div></td>
                           </tr>
                           </table>
                            </tr>
                           ";
		}
?> 	
J'imagine qu'il faudrait que je crée une colonne "statut" dans ma db des utilisateurs, ensuite que dans le formulaire de connexion j'ajoute une update de ce statut. Par contre, je ne sais pas si le statut des utlisateurs changera quand ils quitteront le site sans se déconnecer. A moins d'avoir un timeout de l'utilisateur mais je ne sais pas faire non plus :/

Posté : 04 août 2007, 18:05
par Sékiltoyai
Tu fais une table sessions avec un champ id qui correspond à l'id de l'utilisateur, et timestamp, qui est l'heure à laquelle il a raffraichi ta page.
A chaque affichage de ta page par un utilisateur, tu mets à jour le timestamp ou tu crées un enregistrement dans ta table avec l'id et le timestamp courant s'il n'existe pas. Et en même temps, tu supprimes tous les enregistrements dont le timestamp est inférieur à “maintenant - une_certaine_durée”.
Et résultat, tu as une liste d'utilisateurs connectés dans ta table sessions.

Posté : 05 août 2007, 18:02
par Tyrese
salut,

J'avance à petit pas. J'ai crée dans ma table des utilisateurs une colonne "timestamp" pour l'heure à laquelle la personne se connecte et "status" pour m'indiquer si la personne est online ou offline.

J'ai réussi à coller une image à mes membres se connectant par le biais du formulaire de connexion logon.php
<?
$connexion = mysql_pconnect ("$dbhost", "$dbid", "$dbpass") or die ('Impossible de se connecter à la base de données: ' . mysql_error());
$db = mysql_select_db("$dbname") or die ("erreur de connexion base");

$pseudo = AddSlashes (htmlspecialchars($_POST["pseudo"]));
$mdp = AddSlashes (htmlspecialchars($_POST["mdp"]));

$rq = "SELECT * FROM $db_prefix"._utilisater." "." WHERE pseudo='$pseudo' AND mdp='$mdp'";
$result = mysql_query($rq);

if ($result !== FALSE) //MON SOUCI EST ICI
{
  $lastquerytime = time(); //Il a exécuté ce code MAINTENANT
  $query1 = "UPDATE dp_utilisater SET lastquerytime='$lastquerytime' WHERE pseudo='$pseudo'"; //On l'écrit dans la table
  mysql_query($query1);
  $query2 = "UPDATE dp_utilisater SET status='online' WHERE pseudo='$pseudo'";
  mysql_query($query2);
}


if ($enreg = mysql_fetch_array($result)) { 
session_start();
$_SESSION["dpteam"] = TRUE;
$_SESSION["dpteam_pseudo"] = $enreg["pseudo"];
$_SESSION["dpteam_level"] = $enreg["level"];
$_SESSION["dpteam_id"] = $enreg["id"];
$_SESSION["dpteam_sexe"] = $enreg["sexe"];
$_SESSION["dpteam_pays"] = $enreg["pays"];
$alerte = "session de $_SESSION[dpteam_pseudo] démarré...";

}
else {
$_SESSION["dpteam_membre"] = FALSE;
$alerte = "session non enregistrée ou démarrée...";
}
?>
<script language="Javascript">
<!--window.alert('<?php echo "$alerte";?>');-->
window.location="?p=accueil";
</script>
Grace à ce code, j'arrive à identifier l'utilisateur online et lui assimiler l'image "online".

Par contre si l'utilisateur quitte le navigateur sans se déconnecter, l'image reste online. C'est le meme probleme pour l'affichage des connectés. J'ai bien compris l'utilisation du timestamp mais je ne sais pas où le mettre pour l'afficher où je veux sur ma page.
<? // Affichage des connectés
$fiveminago = time() - 5 * 60;
$query1="SELECT pseudo FROM dp_utilisater WHERE lastquerytime>'$fiveminago'"; //Tous ceux qui ont fait un truc y a moins de 5min
$result = mysql_query($query1);
while ($row = mysql_fetch_array($result)) //Tant qu'on a des noms
{
 echo $row[0]."<br>"; //On les affiche
}

?>
Comme vous voyez ce code permet d'afficher les connectés en prenant compte de l'heure de connexion. Deux choses, j'aimerais l'introduire dans un tableau à part dans un echo entre des balises <td></td> (ainsi le code while ($row = mysql_fetch_array($result)) etc, ne m'est pas utile) mais aussi que mon code prennent en compte le rafraichissement du timestamp afin d'identifier si l'utilisateur n'est plus sur le site au bout de x minutes.

Autre probleme que j'ai relevé, comment indiqué dans le fichier logoff.php, que mon utilisateur devient offline dans ma base de données ? Voici comment se présente ce fichier:
<?php
session_start();
session_unregister("dpteam_pseudo");
session_unregister("dpteam_level");
session_unregister("dpteam_id");
session_unregister("dpteam_sexe");
session_unregister("dpteam_pays");
session_unset();
session_destroy();
?>
<script language="Javascript">
<!-- window.alert('déconexion réussi...');  -->
window.location="?p=accueil";
</script>
Voilà, en espérant ne pas avoir été trop long et avoir été le plus clair possible, merci pour votre aide future =)

Posté : 06 août 2007, 17:05
par Sékiltoyai
Alors, plusieures remarques.
1/
AddSlashes()
J'ai des doutes, à mon avis, php respecte la casse, dans le doute, il vaut mieux mettre en minuscule :
addslashes()
2/ Tu n'as aucune gestion des erreurs SQL, si tu as la moindre erreur, tu ne la diagnostiqueras pas, et c'est génant en développement. Prends l'habitude d'utiliser die() et mysql_error(), par exemple :
$result = mysql_query($requete) or die('Erreur SQL : ' . mysql_error() . "\nRequète:" . $requete);
3/
if ($result !== FALSE) //MON SOUCI EST ICI 
Je ne vois pas d'erreur, normalement, ce code est bon.

4/
  $query1 = "UPDATE dp_utilisater SET lastquerytime='$lastquerytime' WHERE pseudo='$pseudo'";
  mysql_query($query1); 
  $query2 = "UPDATE dp_utilisater SET status='online' WHERE pseudo='$pseudo'"; 
  mysql_query($query2); 
Tu fais 2 requètes de suite quasiment identiques. En règle générale, moins tu feras de requète, mieux ton serveur SQL se portera. Donc, pour ce genre de requètes, fais plutôt ceci :

Code : Tout sélectionner

UPDATE dp_utilisater SET status='online', lastquerytime='$lastquerytime' WHERE pseudo='$pseudo'
5/
Apparement, tu sembles utiliser ta table d'utilisateurs pour implémenter l'idée. Ca marche aussi, mais dans ce cas, il faut que tu supprimes la colonne status qui ne sert à rien, car le status est défini par le champ lastquerytime, et c'est seulement avec ce champ là que tu dois définir le status de l'utilisateur.

6/
Tu utilises time(), personnellement, j'aurais laissé le serveur faire le travail :

Code : Tout sélectionner

UPDATE dp_utilisater SET lastquerytime=NOW() WHERE pseudo='$pseudo'
C'est un gain (négligeable peut être mais un gain tout de même) de ressources, car en règle générale, là encore, tout ce que tu pourras faire faire par ton serveur sql sera fait mieux et plus rapidement.
Et dans ta requète SELECT, tu peux utiliser les fonctions de dates et d'heures :

Code : Tout sélectionner

SELECT pseudo FROM dp_utilisater WHERE lastquerytime > SUBDATE( NOW(), INTERVAL 5 MINUTE)";
7/
Enfin, préfère

Code : Tout sélectionner

SELECT champ1, champ2, champ3, …
à

Code : Tout sélectionner

SELECT *
Car SELECT * te retourne tout, même ce dont tu n'as pas besoin, et c'est donc une charge supplémentaire pour le serveur SQL.

Posté : 06 août 2007, 18:09
par Tyrese
nickel je te remercie pour toutes ces infos, cependant j'ai apporté une modif à UPDATE dp_utilisater SET lastquerytime=NOW() WHERE pseudo='$pseudo'

en effet, lorsque j'ai mis ce code, dans ma sql, j'avais juste l'année qui était retenu alors j'ai mis ça UPDATE dp_utilisater SET lastquerytime=NOW() + 0 WHERE pseudo='$pseudo'
et là, nickel :)

donc me voilà avec ma liste de connecter à jour je te remercie pour ces éclairages =)

maintenant pour ce qui ait d'assigner une image... ne sachant pas comment faire, j'ai crée la colonne status à cet effet avec comme valeur par défaut 'offline' (car mon image s'appelle offline.gif, c'etait plus simple pour moi et en plus j'arrive à afficher l'image où je veux).

extract($ligne);
$userstatus = $ligne["status"];
$userid = $ligne["id"];
if($ligne[status] == "") { $status = ""; }
else { $status = "Status : $ligne[status]<br>"; }

echo "
<tr>
 <td class='leftb' width='50'><center><img src=img/$ligne[status].gif></center></td></tr>"
Cependant, j'imagine bien qu'il y a plus simple en se servant du code $query1="SELECT pseudo FROM dp_utilisater WHERE lastquerytime > SUBDATE( NOW(), INTERVAL 5 MINUTE)"; mais je suis figer à vrai dire. De même pour mes connectés, je n'arrive pas à les afficher où je veux.

Le
while ($row = mysql_fetch_array($result)) //Tant qu'on a des noms
{
 echo $row[0]."<br>"; //On les affiche
}
me bloque.

Posté : 06 août 2007, 19:12
par Sékiltoyai
Bah à ce moment, là, tu peux faire un truc de ce style :

Code : Tout sélectionner

SELECT pseudo, lastquerytime > SUBDATE( NOW(), INTERVAL 5 MINUTE ) AS online FROM dp_utilisater;
Tu mets la condition que tu veux dans le WHERE et tu as les membres que tu veux, avec leur status.

Posté : 06 août 2007, 21:32
par Tyrese
J'ai du mal je t'avouerais lol

je ne comprends pas très bien ta fonction mais surtout où mettre le WHERE.
SELECT pseudo, lastquerytime > SUBDATE( NOW(), INTERVAL 5 MINUTE ) AS online FROM dp_utilisater;
Si je comprends bien ce code, on selectionne la colonne des pseudos et les pseudos qui sont online depuis moins de 5 minutes et on les identifie comme online. Si c'est le cas, je ne vois pas comment continuer ce code

Posté : 06 août 2007, 23:47
par Sékiltoyai
Cette requète te donne la liste des membres, avec dans l'alias online, s'ils sont en ligne ou non. Tu n'as plus qu'à faire un test sur cette variable pour afficher telle ou telle image. Et si tu veux sélectionner des membres précis, tu spécifies ta condition dans le WHERE, et tu auras ces membres, avec en plus, dans l'alias online, s'ils sont connectés ou non. C'est plus clair ?
Dans le cas contraire, il va falloir me dire où tu bloques…

Posté : 07 août 2007, 01:07
par Tyrese
en fait je bloque après cela :
$query1 = ("SELECT pseudo, lastquerytime > SUBDATE( NOW(), INTERVAL 5 MINUTE ) AS online FROM dp_utilisater") or die(mysql_error()); //Tous ceux qui ont fait un truc y a moins de 5min
$resultat = mysql_query($query);
while( $online = mysql_fetch_array($resultat))
{
J'ai donc ecrit ce code sur tes conseils, j'ai donc selectionné tous les utilisateurs en ligne depuis moins de 5 mnutes et ceux ci sont considérés online. Cependant, je n'arrive pas à aller plus loin en spécifiant que ces utilisateurs devront avoir une image à coté de leur pseudo.
De plus je ne sais meme pas si mon code est bon :/ je galère sévère, c'est dur le php quand on approfondit lol :p

Posté : 07 août 2007, 03:06
par Sékiltoyai
Est ce que tu pourrais m'expliquer dans quel cadre les utilisateurs auront cette image à côté de leur pseudo ? C'est quand on va voir leur profil ? Ou bien quand on voit leurs contributions (post, commentaire), par exemple pour un forum ou un blog ?
Parce que j'aurais tendance à te dire que récupérer la liste des connectés et dire s'il doit y avoir telle ou telle image à côté d'un pseudo, ce sont deux requètes différentes. On peut regroupper les deux en une requètes avec un code php approprié, mais s'il n'y a que l'un ou l'autre à récupérer, par exemple, les 2 requètes sont différentes.

Posté : 07 août 2007, 08:20
par Tyrese
Alors en fait les utilisateurs de cette page sont les joueurs de plusieurs équipes de jeux en réseau.
Toutes ces personnes auront cette image à coté de leur pseudo sur cette page et uniquement sur cette page. C'est juste une page php. Donc c'est pour ça, j'aurais tendance à dire qu'il suffit de récupérer la liste de tous les membres (de ces équipes et au delà car on sait jamais, je risque de faire un bloc de tous les membres connectés au site, à part de cette page) et de leur attribuer l'image appropriée (on line ou offline) à coté de leur pseudo.
J'espere t'avoir éclairé sur ma création =)

Posté : 07 août 2007, 14:46
par Tyrese
Bon alors j'ai étudié le probleme sous différente couture, et je suis revenu à l'idée de créer une colonne status dans ma table d'utilisateurs.

Alors voilà pourquoi :
$query1 = "UPDATE dp_utilisater SET lastquerytime=NOW(), status='online' WHERE pseudo='$pseudo'"; //On l'écrit dans la table
  mysql_query($query1);
Lors de la connection d'un utilisateur, l'heure est enregistré, de meme que son statut.

Dans la page membre, voilà ce que j'ai introduit pour obtenir l'image "online" ou "offline".
$query = ("SELECT * FROM $db_prefix"._utilisater." WHERE squad='$id'") or die(mysql_error()); 
$result = mysql_query($query);

$tr = 1;
while( $ligne = mysql_fetch_array($result))
{
extract($ligne);
$userstatus = $ligne["status"];
$userid = $ligne["id"];
if($ligne[status] == "") { $status = ""; }
else { $status = "Status : $ligne[status]<br>"; }

$ligne[info] = stripslashes($ligne[info]);
$imglink = "admin/uploads/members/$ligne[pseudo].jpg";
if(file_exists($imglink)){$img = $imglink; $link="1";}
else{
 $img = "admin/uploads/members/nopic.jpg"; $link="0";
}
$ligne[grade] = stripslashes($ligne[grade]);
if($ligne[grade] == "") { $grade = ""; }
else { $grade = "Grade : $ligne[grade]<br>"; }

echo "
<tr>
  <td class='leftb'><img src='admin/uploads/flags/$ligne[pays].gif'></td>
  <td width='150' class='leftb'><a href='?p=equipe&action=view&id=$userid'><B>$ligne[pseudo]</b></a></td>
  <td width='150' class='leftb'><i>$ligne[grade]</i></td>
  <td class='leftb' width='50'><center><img src=img/$ligne[status].gif></center></td>
  </tr>
   <tr>
     <th class='breakline' height='100%' colspan='6'></th>
 </tr>
";
}
Ensuite, sur ma page index.php, je souhaiterais que la personne soit offline au bout de 5 minutes. J'ai donc mis ça :
$query7 = ("UPDATE dp_utilisater SET status='offline' WHERE lastquerytime < SUBDATE( NOW(), INTERVAL 5 MINUTE )"); //On l'écrit dans la table
mysql_query($query7);


Jusque là, pas de probleme, mes statuts sont mis à jour lorsque les gens se connectent, et 5 minutes après, ils sont mis offline.

Miantenant, j'ai une interrrogation. J'aimerais que, tant que les utilisateurs sont sur leur session et donc connectés avec leur login, que leur timestamp soit rafraichit.
Est-il possible de mettre à jour le timestamp si l'utilisateur est toujours connecté au site ? Si oui, comment vu que la personne n'est jamais déconnecté d'elle meme, mais au bout de 5 minutes meme si elle est toujours présente sur le site ?[/b]

Posté : 07 août 2007, 15:16
par zeus
Il ne faut donc pas mémoriser la date de dernière connexion mais la date de la dernière visite, c'est à dire la dernière fois que ce membre à afficher une page ;)

Du coup, à chaque fois qu'il affiche une page, son compteur repart pour 5mn ;)

Posté : 07 août 2007, 16:32
par Sékiltoyai
Et je t'ai dit d'abandonner l'idée d'un champ status qui est inutile. Le statut, tu l'as avec le test

Code : Tout sélectionner

lastquerytime < SUBDATE( NOW(), INTERVAL 5 MINUTE )
Partout où tu as besoin du statut dans une requète, tu remplace par le test.
Je ne vois pas pourquoi tu veux te compliquer avec un champ supplémentaire inutile.