Membre Online

Répondre
Lefounard
Lefounard
Déconnecté
I am singing in the rain , I am happy again !!
Salut,
Bon voila un script qui comptabilise le nombre de membre et d'internaute en ligne :
Le script n'est pas personnel, car j'ai repris le comment faire de laglobule.
Je voudrais vos avis, car c'est peut-etre maladroit !


Voici la table mysql live !
  1.  
  2. CREATE TABLE `site_nb_online` (
  3. `id_connexion` int(8) NOT NULL auto_increment,
  4. `time` bigint(16) NOT NULL default '0',
  5. `id_membre` int(8) NOT NULL default '0',
  6. PRIMARY KEY (`id_connexion`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=77094034 ; 



voici le fichier a inclure dans les pages du site pour comptabiliser les connecter.

  1.  
  2. <?php
  3. $tps_max_connex = 180;  
  4. $temps_actuel = date("U");  
  5.  
  6. if(!isset($_SESSION['id_connexion'])) { 
  7.    $_SESSION['id_connexion'] = rand(1,99999999); 
  8.    $sql = 'INSERT INTO site_nb_online VALUES("'.$_SESSION['id_connexion']. '", "'.$temps_actuel.'",'; 
  9.    if(!isset($_SESSION['pseudo'])) $sql.='"0")'; 
  10.    else $sql.='"'.$_SESSION['id'].'")'; 
  11.    $req = mysql_query($sql) or die ('Erreur SQL !'.$sql.''.mysql_error()); 
  12.    }  
  13. else { 
  14.    $sql = 'UPDATE site_nb_online SET time = "'.$temps_actuel.'" WHERE id_connexion= "'.$_SESSION['id_connexion'].'"';  
  15. $req = mysql_query($sql) or die ('Erreur SQL !'.$sql.''.mysql_error()); 
  16.    }  
  17.  
  18. $heure_max = $temps_actuel - $tps_max_connex;  
  19.  
  20. $sql2 = 'DELETE FROM site_nb_online where time < "'.$heure_max.'"';  
  21. $req2 = mysql_query($sql2) or die ('Erreur SQL !'.$sql2.''.mysql_error());  
  22.  
  23. ?>
  24.  


Je considere que mes membre ont une variable de session id stockant leur id, et j'attribut a 'nimporte quel internaute membre ou pas une variable de sessions id_connexion


Voila le code pour afficher (total des internautes DONT membres)
  1. <?php
  2. session_start();  
  3. //votre connexion mysql  
  4.  
  5. $sql = 'SELECT count(*) FROM site_nb_online';  
  6. $req = mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error());  
  7.  
  8. $data = mysql_fetch_array($req);  
  9. mysql_free_result($req);  
  10.  
  11. echo 'Il y a actuellement ' , $data[0] , ' internaute(s) surfant sur ce site.';  
  12.  
  13. $sql = 'SELECT id_membre FROM site_nb_online WHERE id_membre!="0"';  
  14.  
  15. $req = mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error());  
  16. $i=0;  
  17.  
  18.  
  19. echo 'Membres connecté(s) :';  
  20. while ($data2 = mysql_fetch_array($req))  
  21. { 
  22.    echo whoishe($data2['id_membre']).' , '; 
  23.    $i++;  
  24. }  
  25. echo '('.$i.' membre(s)).';  
  26.  
  27. mysql_free_result($req);?>
  28.  


Resultats :

Il y a actuellement 1 internaute(s) surfant sur ce site.
Membres connecté(s) :Vince , (1 membre(s)).

rand(1,99999999); la probabilité que deux internaute se retrouve avec une meme valeur est quasi nulle ! j'ai mis un champs int 8 dans la bdd, ca suffit non ?! Peut-etre une meilleur idée pour un identifiant de connexion ?

Je tiens a remercier, celui qui a inventer le php, laglobule, bzh et sebastian pour m'avoir aider !

Voila, bon je voudrais vos avis et conseils sur des trucs que je n'ai pas pensé et qui peuvent etre source de bugs ?! sinon comment l'optimiser !
MErci de vos conseils,
Ciao,
LA GLOBULE
LA GLOBULE
Déconnecté
111 111 111 x 111 111 111 = 12 345 678 987 654 321
Peut-etre une meilleur idée pour un identifiant de connexion ?

session_id

A priori, l'identifiant de session est unique, je ne vois pas l'interet de générer un truc au pif qui pourrait etre commun entre deux visiteurs.
Lefounard
Lefounard
Déconnecté
I am singing in the rain , I am happy again !!
Salut,
merci de l'information, je ne savais pas, je vais l'integrer a mon code.
Ciao,
Bzh
Bzh
Déconnecté
Juste pour savoir, vous ne pensez pas qu'il serait préférable de passer par un simple fichier texte pour cela ?

C'est exactement comme un compteur, cela augmente tout de même le nombre de requette à la base de donnée !

Parce que, entre l'UPDATE et le DELETE, sa fait tout de même lourd ! Nan ? Ce sont tout de même les requettes les plus lourdes !

L'accès à un simple fichier et l'écriture dedans est quand même beaucoup plus rapide !

Vous ne pensez pas ?
LupusMic
LupusMic
Déconnecté
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Je crois qu'on a déjà débattu de l'accès concurrent à un fichier ;)

Une base de données c'est fait pour ça. Et puis, une base de données, c'est juste un middleware entre ton PHP et le système de fichiers.
Bzh
Bzh
Déconnecté
Oui mais gérer un fichier avec un maximum de 50 lignes soit 500 caratères est tout de même beaucoup plus rapide que des requettes du style UPDATE qui sont TRÈS TRÈS lourdes...

C'est exactement comme pour un simple compteur, tu ne vas pas utiliser mysql pour sauvegarder et incrémenter un simple int !

Si ??? Faut être réaliste quant même...
LupusMic
LupusMic
Déconnecté
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Entre la rapidité et la fiabilité je fais mon choix, feed the troll >:)
Répondre
Accès rapide :

Remonter Remonter
L'éditeur javascript - CSS - Gentoo - Tutoriaux PHP - Tutoriels PHP - Php - Breizh Blog