JeuWeb - Crée ton jeu par navigateur
Qui est en ligne - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Qui est en ligne (/showthread.php?tid=3129)

Pages : 1 2


Qui est en ligne - Thedeejay - 04-10-2008

All's in the title...
je voudrais récuperer qui est en ligne via les sessions en cours et/ou le nombre de non membres et avoir en retour par exemple:

Citation :En ligne: Thedeejay , Le p'titkifoo of the neufdeux , et 3 inconnus.
Voila! Merci beaucoup!


RE: Qui est en ligne - Eluox - 04-10-2008

Personnellement, comme j'utilise un champ de type timestamp pour les jeux, avec le timestamp de la dernière actualisation , je fait un SELECT des timestamps ayant moins de 5mn Wink

Par les sessions si je comprends, et bien je vois pas ^^


RE: Qui est en ligne - Ekilio - 04-10-2008

Je ne crois pas que ce soit réellement possible par les session... en tous cas, je ne vois pas comment. La seule méthode que je verrais serait d'utiliser session_set_save_handler pour reconfigurer la manière de sauver les informations de ta session de manière à savoir qui est là. Tu peux aussi tenter en utilisant session_save_path et en comptant le nombre de fichier, mais je ne suis pas sûr que ça suffise...

Sinon, une alternative comme le disait Eluox est de faire un script de ce genre :

Code PHP :
<?php 
// Ceci est executé à chaque page
mysql_query('INSERT INTO enligne (id, heure) VALUES (' . $id_du_joueur . ', ' . time() . ') ON DUPLICATE KEY UPDATE heure = ' . time());
mysql_query('DELETE FROM enligne WHERE heure < ' . time() - 300);

Et ensuite tu fais un simple select sur ta table pour voir qui est là (pour les invités, je te laisse gérer :-p)


RE: Qui est en ligne - Thedeejay - 04-10-2008

merci, je vais tenter comme ca Smile


RE: Qui est en ligne - Ter Rowan - 04-10-2008

je ne sais pas répondre autrement qu'avec le timestamp, mais il me parait possible aussi de passer par les sessions.

en effet on a vu des posts sur le forum qui permettait de lire les sessions d'autres joueurs (si mes souvenirs sont bons c'est dans une idée de messagerie instantanée)

Y a certainement moyen donc. Est ce plus pertinent que le timestamp, je ne sais pas Smile


RE: Qui est en ligne - Ekilio - 04-10-2008

J'aimerais vraiment savoir comment on peut lire les sessions d'autres joueurs, à part en passant par une bdd pour stoquer les infos... Parce que j'ai justement épluché la doc de php et j'ai rien trouvé Confused


RE: Qui est en ligne - Thedeejay - 04-10-2008

Voila le code final que j'ai créé si vous en avez besoin

Code PHP :
<?php 
session_start
();
if (!isset(
$_SESSION['login'])) { //si le membre n'est pas connecté
// on insert 'inconnu123123'
mysql_query('INSERT INTO enligne (login, heure) VALUES ('inconnu123123', ' . time() . ') ON DUPLICATE KEY UPDATE heure = ' . time());
mysql_query('DELETE FROM enligne WHERE heure < ' . time() - 300);
else
//sinon bah il est connecté
// qui est en ligne
//on schtroupf la variable du nom
$login = $_SESSION['login']
mysql_query('INSERT INTO enligne (login, heure) VALUES (' . $login . ', ' . time() . ') ON DUPLICATE KEY UPDATE heure = ' . time());
mysql_query('DELETE FROM enligne WHERE heure < ' . time() - 300);

?>
le mysql
Code PHP :
<?php 
CREATE TABLE enligne
(
heure text NOT NULL,
login text NOT NULL,
)
TYPE=MyISAM;
et le code d'affichage
Code PHP :
<?php
mysql_connect
("localhost", "user", "pass");
mysql_select_db("bdd");

$requete = mysql_query("SELECT * FROM enligne");


// On fait une boucle pour lister tout ce que contient la table :

while ($enligne = mysql_fetch_array($requete) )
{
?>
<?php
if ($enligne['login']; = 'inconu123123'
{
$inconnu = $inconnu + 1
$total
= $total + 1
}
else
{
$total = $total + 1
?>

<a href='liste_membres.php?membre=<?php echo $donnees['pseudo']; ?>"><?php echo $donnees['pseudo']; ?></a> ,
<?php
}
}

mysql_close(); // Déconnexion de MySQL
?>
et <?php
if $inconnu = 0
echo 'aucun'
else
echo
$inconnu
?>
inconnu<?php if $inconnu = >2 echo 's'//si il y a plus d'un inconnu ?> visite<?php if $total = >2 echo 'nt'//si il y a plus d'un visiteur au total ?>
Voila, je n'ai pas testé mais je vous dit au plus vite...
J'ai nommé l'inconnu 'inconnu123123' car si un membre à la bonne idée de s'appeller 'inconnu' il ne sera pas affiché...


RE: Qui est en ligne - Ekilio - 04-10-2008

Coucou,

Ca ne marchera pas.

Quelques petites erreurs dans ton code :

- Le champ "login" doit être une clef primaire (ou unique), sinon on duplicate key update ne fera rien.
- Si le champ "login" est une clef, chaque nouvel inconnu mettra juste à jour la date de dernière connexion de l'inconnu, ça ne le changera pas. Pour éviter ça, tu as plusieurs choix : soit tu stoques l'ip pour les membres anonymes, à la place du login (ce qui est le plus simple) et ensuite si le login est de la forme XXX.XXX.XXX.XXX c'est un membre anonyme, soit tu incrémentes à compteur à chaque update (c'est moins efficace, surtout si le membre anonyme va sur plusieurs pages) soit tu met un enregistrement aléatoire ($login = 'inconnu' . rand()) et tu cherches avec les premiers caractères les inconnus.

La première méthode (IP) me semble la meilleure.


RE: Qui est en ligne - Thedeejay - 04-10-2008

ah oui je n'y avait pas pensé...
je vais faire ca à l'ip


RE: Qui est en ligne - Thedeejay - 04-10-2008

Hééé! mais non... car l'ip sera affiché, car je peux pas saoir si c'est un membre a part avec 10 000 requetes sur ma pauvre base de données qui souffre déjà bien...