Membre Online

Répondre
Lefounard
le 11/04/2006 à 00:13
Lefounard
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 !
CREATE TABLE `site_nb_online` (
`id_connexion` int(8) NOT NULL auto_increment,
`time` bigint(16) NOT NULL default '0',
`id_membre` int(8) NOT NULL default '0',
PRIMARY KEY (`id_connexion`)
) 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.

<?php
$tps_max_connex = 180;
$temps_actuel = date("U");

if(!isset($_SESSION['id_connexion'])) {
$_SESSION['id_connexion'] = rand(1,99999999);
$sql = 'INSERT INTO site_nb_online VALUES("'.$_SESSION['id_connexion']. '", "'.$temps_actuel.'",';
if(!isset($_SESSION['pseudo'])) $sql.='"0")';
else $sql.='"'.$_SESSION['id'].'")';
$req = mysql_query($sql) or die ('Erreur SQL !'.$sql.''.mysql_error());
}
else {
$sql = 'UPDATE site_nb_online SET time = "'.$temps_actuel.'" WHERE id_connexion= "'.$_SESSION['id_connexion'].'"';
$req = mysql_query($sql) or die ('Erreur SQL !'.$sql.''.mysql_error());
}

$heure_max = $temps_actuel - $tps_max_connex;

$sql2 = 'DELETE FROM site_nb_online where time < "'.$heure_max.'"';
$req2 = mysql_query($sql2) or die ('Erreur SQL !'.$sql2.''.mysql_error());

?>


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)
<?php
session_start();
//votre connexion mysql

$sql = 'SELECT count(*) FROM site_nb_online';
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error());

$data = mysql_fetch_array($req);
mysql_free_result($req);

echo 'Il y a actuellement ' , $data[0] , ' internaute(s) surfant sur ce site.';

$sql = 'SELECT id_membre FROM site_nb_online WHERE id_membre!="0"';

$req = mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error());
$i=0;


echo 'Membres connecté(s) :';
while ($data2 = mysql_fetch_array($req))
{
echo whoishe($data2['id_membre']).' , ';
$i++;
}
echo '('.$i.' membre(s)).';

mysql_free_result($req);?>


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,
I am singing in the rain , I am happy again !!
LA GLOBULE
le 11/04/2006 à 08:28
LA GLOBULE
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
le 11/04/2006 à 13:55
Lefounard
Salut,
merci de l'information, je ne savais pas, je vais l'integrer a mon code.
Ciao,
I am singing in the rain , I am happy again !!
Bzh
le 15/04/2006 à 18:04
Bzh
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
le 21/04/2006 à 16:32
LupusMic
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.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Bzh
le 23/04/2006 à 20:59
Bzh
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
le 24/04/2006 à 21:23
LupusMic
Entre la rapidité et la fiabilité je fais mon choix, feed the troll >:)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
carmi
le 11/06/2009 à 14:07
carmi
bonjour,

Je ne comprend pas très bien comment utiliser WHOISHE

# $sql = 'SELECT id_membre FROM site_nb_online WHERE id_membre!="0"';

$req = mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error());
$i=0;


echo 'Membres connecté(s) :';
while ($data2 = mysql_fetch_array($req))
{
echo whoishe($data2['id_membre']).' , ';
$i++;
}


j'ai réussi a l'adapter a ma sauce, l'id de mes membre s'ajoute bien en cas de connexion et est défini a 0 lorsque c'est un visiteur. mais cela n'affiche pas leur pseudo.

pouvez vous m'éclaircir svp?

Merci pour votre temps.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours