N-PN White-Hat Project
[PHP] Qui est en ligne - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages interprétés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=27)
+--- Sujet : [PHP] Qui est en ligne (/showthread.php?tid=2502)

Pages : 1 2


[PHP] Qui est en ligne - sakiir - 12-12-2012

salut salut !!
alors voila j'aimerais afficher la liste des utilisateur e ligne sur mon site .
Je pense savoir qu’il y a plusieurs manière de le faire mais je n'ai jamais trouvé une solution qui me convient vraiment .. :/
alors si quelques personnes pouvaient me donner leur réponse ici, ça serai hyper sympa ! Smile


RE: [PHP] Qui est en ligne - CyberSee - 12-12-2012

Enfaite c'est plutôt simple ... Il suffit de sauvegarder dans une table l'IP des visiteurs avec un Time stamps puis on choisit après combien de minutes d'inactivité un membre est considéré offline.

Créé une table 'session': id, ip, stamp
Créé une page session.php
Inclus-la une fois dans TOUTES les pages de ton site
Ajoute le code suivant:
Code PHP :
<?php

    
// Connexion à la DB requise

    
$myip $_SERVER['REMOTE_ADDR']; // Attention de protèger la variable
    
$ip mysql_fetch_array(mysql_query("SELECT * FROM session WHERE ip='$myip'"));
    
    
// Si la personne existe déjà
    
if ($ip['id']){
        
// Update du time stamp
        
$update mysql_query("UPDATE session SET stamp='".time()."' WHERE id='".$ip['id']."'");
    }else{
        
// Il est nouveau on l'ajoute
        
$insert mysql_query("INSERT INTO session (id, ip, stamp) VALUES ('', '$myip', '".time()."')");
    }

    
// On delete les vieux
    
$vieux_stamp strtotime('-30 minutes',time());
    
$delete mysql_query("DELETE FROM session WHERE stamp<='$vieux_stamp'");
    
    
// On affiche le nombre de visiteurs en ligne
    // A ajouté la ou tu veux le message
    
echo "Il y a actuellement ".count($ip)." membres sur le site!";
    
?>

Je tiens juste à dire que je n’ai pas testé mon code, je fais juste la balancer comme ça :-) Mais en théorie ça devrait marcher.


RE: [PHP] Qui est en ligne - sakiir - 12-12-2012

merci pour ta réponse ! je vais étudier le code ! et le mettre en œuvre ! Smile

j'ai modifié quelque erreur que tu avais faite .. j'ai la pretention de croire que tu t'es trompé , que tu as confondu ip et id dans ton code mais j'ai compris le principe en faite c'est une sorte de decomtpe avant le timeout qui veut dire que le user est offline.

Code :
<?php

    // Connexion à la DB requise
    include('./inc/connection.inc.php');
    $myip = $_SERVER['REMOTE_ADDR']; // Attention de protèger la variable
    $data = mysql_fetch_array(mysql_query("SELECT * FROM session WHERE ip='$myip'"));
    
    // Si la personne existe déjà
    if ($data['ip']){
        // Update du time stamp
        $update = mysql_query("UPDATE session SET stamp='".time()."' WHERE id='".$data['ip']."'");
    }else{
        // Il est nouveau on l'ajoute
        $insert = mysql_query("INSERT INTO session (id, ip, stamp) VALUES ('', '$myip', '".time()."')");
    }

    // On delete les vieux
    $vieux_stamp = strtotime('-30 minutes',time());
    $delete = mysql_query("DELETE FROM session WHERE stamp<='$vieux_stamp'");
    
    // On affiche le nombre de visiteurs en ligne
    // A ajouté la ou tu veux le message
    echo "There are ".count($data)." members who look at this page ..";
    
?>

et donc j'ai rencontré un soucis 'est les données que je dois entrer dans la base de données, j'ai mis INT A.I pour l'id, pour l'ip j'ai mis un VARCHAR, et pour le timestamp je ne sais pas du tout quoi mettre .. j'ai aperçu le mot timestamp dans la liste mais celui-ci ne fonctionne pas. c'est a dire qu'aucune donnée ne reste dans la table ..


RE: [PHP] Qui est en ligne - CyberSee - 13-12-2012

Si tu parles du

WHERE id='".$data['ip']."

Non je ne me suis pas trompé, selon ma syntaxe (WHERE id='".$ip['id']."') c'est bien id qu'il faut mettre. Par contre, si tu veux absolument trouver la ligne par l'IP faut remplacer par

WHERE ip='".$data['ip']." et non id='".$data['ip']."'

Dans les deux cas, ça fonctionne parce que IP est également unique. l'important c'est que si tu utilise id, faut que tu utilises la variable id et si tu utilises ip faut que tu utilises la variable ip évidemment :-)

L'id c'est ta clé primaire. Elle doit être en INT(10) en auto increment
L'ip et le time stamp peuvent toute les deux êtres VARCHAR(255)


RE: [PHP] Qui est en ligne - sakiir - 13-12-2012

ok merci de ta réponse.. je vais cogiter !

Code :
"SELECT * FROM session WHERE id='$myip'"
Mais ton ton code je ne comprends pas comment id peut être égal a $myip ..


RE: [PHP] Qui est en ligne - CyberSee - 13-12-2012

AH oui a cette endroit c'est effectivement ip qu'il faut mettre :-)


RE: [PHP] Qui est en ligne - sakiir - 13-12-2012

-lol- Big Grin
J'ai enfin fais fais fonctionné le script en le modifiant un peu :p j'ai fais ça avec les session..

Donc les utilisateurs on un délai de 1 minute après il sont offline

Donc il y a une table id(pas vraiment utile), active(booléen pour 1:online;2:offline), user(username de l'utilisateur), et le stamp(bien sure très important).

j'ai re-commenté le code pour plus de compréhension Smile :

Code :
<?php
session_start();
include('./inc/connection.inc.php');
//On prend  tout dans la table session quand user est egal au non dutilisateur qui regarde la page..
$data = mysql_fetch_array(mysql_query('SELECT * FROM session WHERE user="'.$_SESSION['username'].'"'));

if(isset($data['user'])){
//si l'utilisateur est dans la table session :
//on ajoute le stamp qui est egal au temp actuel ui sera fi dans la bdd..
mysql_query('UPDATE session SET stamp="'.time().'" WHERE user="'.$_SESSION['username'].'"') or die('failed to update');
//on met active à 1 pour mettre online l'utilisateur.
mysql_query('UPDATE session SET active=1  WHERE user="'.$_SESSION['username'].'"') or die('failed to update');
}else{
//sinon.. on ajoute les données, donc a partir de maintenant tout les user qui verront la page seront ajouté à la table (avec le time())
mysql_query("INSERT INTO session VALUES('',1,'".$_SESSION['username']."','".time()."')") or die('failed to insert new value');
}
//on ajoute une variable qui nous laissera : time() + une minute qui sera notre delai de timeout()
$stplus = time() - (1 * 60);
//si un de TOUT les user a un stamp < ou =  à la variable précédente, on met offline.. cela verifiera pour tout les user à chaque fois qu'un se$
mysql_query("UPDATE session SET active=0 WHERE stamp<='$stplus'") or die('failed to set offline');

?>



RE: [PHP] Qui est en ligne - InstinctHack - 14-12-2012

Le.champ actif ne sert a rien et n'est pas tres parlant, au niveau sql (sans regarder le code php ), il signifie quoi ?rien.
Donc supprime le. Pour ensuite faire la liste des gens connecter, tu parcours l'objet renvoyé par sql et tu compare le time actuel avec le dernier time enregistrer auquel tu apporte le temps maximun pendant lequel l'utilisateur est connecter meme si il ne fait aucune requête


RE: [PHP] Qui est en ligne - sakiir - 14-12-2012

je l'utilise sur plein de page, donc il est préférable pour moi d'utiliser ça, après, je peux faire une fonction que j'inclurais mais la structure de mon site ne le permet pas


RE: [PHP] Qui est en ligne - JulienetNel - 14-12-2012

Pourquoi ne pas utiliser une fonction plus simple.

Dans le champs utilisateur de la base de donnée, il y aurait un 0 pour pas en ligne et 1 pour en ligne. Si c'est un 0 alors le gars est en ligne et si c'est 1 alors le gars n'est pas en ligne.

On pourrait changer le nombre, lorsque le gars se connecte et se déconnecte.

Il suffirait ensuite d'une simple condition avec if, elseif et else pour faire le tri.

Le else pouvant servir si aucune des conditions n'est rempli, ce qui ne devrait pas arriver. Mais dans cette situation, tu peux choisir une troisième situation : invisible.


RE: [PHP] Qui est en ligne - InstinctHack - 14-12-2012

et comment tu sais si il est connecter ou non avec un simple true/false ?


RE: [PHP] Qui est en ligne - sakiir - 14-12-2012

Avec un 'SELECT WHERE active=1' ..


RE: [PHP] Qui est en ligne - JulienetNel - 14-12-2012

(14-12-2012, 12h18)khaled a écrit : et comment tu sais si il est connecter ou non avec un simple true/false ?

Imaginons qu'on est un champs Valide ou Connect, quand l'utilisateur se connecte alors le script remplace la valeur par 1. Si il se déconnecté, alors on remplace la valeur par 0. Si il a condition n'est pas remplit dans l'un ou l'autre, on peut remplir avec un 2 au bout d'un certains temps : Ce qui voudrait que le gars n'est ni considéré en ligne et ni hors ligne, on le considère en situation inconnu. On peut aussi calculer à partir de quand l'utilisateur est déconnecter automatiquement de la session, si il y en a une limite de session et faire passer son champs en 0.

(14-12-2012, 19h55)sakiir a écrit : Avec un 'SELECT WHERE active=1' ..

En quelque sorte ...


RE: [PHP] Qui est en ligne - ThibauT - 14-12-2012

Mais s'il ferme la page directement sans passer par l'option de déconnexion, qu'en es t'il ?


RE: [PHP] Qui est en ligne - sakiir - 14-12-2012

et bien c'est la meme chose il est deconnecté..