AFFICHER LA LISTE DES MEMBRES CONNECTÉS

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 11 déc. 2006 à 09:22
 fhz - 30 oct. 2017 à 14:44
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40667-afficher-la-liste-des-membres-connectes

ou peux on télécharger ses mal foutu
merci du partage
centaureof40 Messages postés 1 Date d'inscription dimanche 26 juillet 2009 Statut Membre Dernière intervention 26 juillet 2009
26 juil. 2009 à 20:30
Bonjour, j'aimerai savoir si quelqu'un pourrai corrigé ce script, car j'ai essayés et je n'arrive pas, je connais pas le php, j'arrive à comprendre un peu le code mais j'arrive pas à le faire fonctionné. Merci d'avance.
tibob135 Messages postés 34 Date d'inscription mercredi 15 août 2007 Statut Membre Dernière intervention 5 février 2008
16 janv. 2008 à 02:43
ca marche avec ma table membre? ou il faut que je change?
schunck Messages postés 10 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 24 mai 2007
24 mai 2007 à 11:28
J'ai trouvé mon erreur,
- $query = "SELECT * FROM gcp_members WHERE login='$login'"; //On récupère ses infos dans la bdd
$Result = mysql_query($sql) or die (mysql_error())
le sql ne correspondait pas, et également une } mal placé.

reste à afficher !
Merci à coucou747 pour sa réactivité ;)
schunck Messages postés 10 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 24 mai 2007
24 mai 2007 à 11:04
merci beaucoup, à force de lire et relire on en oublie des choses toutes bètes.
Cette correction fait apparaitre une autre erreur :

Warning: mysql_query(): Access denied for user: 'www@localhost' (Using password: NO) in /home/jsuissexy2/www/connected_users.php on line 17

Warning: mysql_query(): A link to the server could not be established in /home/jsuissexy2/www/connected_users.php on line 17
Access denied for user: 'www@localhost' (Using password: NO)

Et à vrai dire, je comprend pas. J'ai un peu tout essayer mais en vain. Pourtant l'erreur semble simple à localiser !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
24 mai 2007 à 10:46
$Result = mysql_query($sql) or die (mysql_error())
=>

$Result = mysql_query($sql) or die (mysql_error());

il te manque un ;
schunck Messages postés 10 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 24 mai 2007
24 mai 2007 à 10:32
Bonjour à tous ! tout d'abord, merci pour ces commentaires.
J'ai un souci et je n'arrive pas à trouver le problème.


Connected :

<?
function conect()
{
include "inc/C_error.inc";
include "inc/C_conect.inc";
$conection = mysql_connect($host, $user, $password)
or die ("$er_mysql");
$db = mysql_select_db($database, $conection)
or die ("$er_db");
}

if(isset($_COOKIE[login]) && !empty($_COOKIE[login]))
{
$login = $_COOKIE[login];
$query = "SELECT * FROM gcp_members WHERE login='$login'"; //On récupère ses infos dans la bdd
$Result = mysql_query($sql) or die (mysql_error())

if ($Result !== FALSE) //MON SOUCI EST ICI
{
$lastquerytime = time(); //Il a exécuté ce code MAINTENANT
$query = "UPDATE gcp_members SET lastquerytime='$lastquerytime' WHERE login='$_COOKIE[login]'"; //On l'écrit dans la table
mysql_query($query);
}
}

$fiveminago = time() - 5 * 60; //5*60s=5min de délai, mettez ce que vous voulez
$query = "SELECT login FROM gcp_members WHERE lastquerytime>'$fiveminago'"; //Tous ceux qui ont fait un truc y a moins de 5min
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) //Tant qu'on a des noms
{
echo $row[0], '
';
}

?>

VOICI MON MESSAGE D'ERREUR / Parse error: parse error, unexpected T_IF in /home/jsuissexy2/www/connected_users.php on line 19

soit le result.

Je n'ai aucune formation en php, si ce n'est la passion. Alors soyez indulgent si mon erreur est bebete.
Merci à vous tous de partager votre matière grise et votre tolérence......
cs_jojolapine Messages postés 2 Date d'inscription dimanche 10 septembre 2006 Statut Membre Dernière intervention 25 février 2007
25 févr. 2007 à 12:07
je voudrai simplement rajouter (j'ai pas eu le courage de lire tout vos commentaires en détail, ça à peut-être été dit...)
Mais lorsque tu présentes une table mysql... Il serait préférable qu'elle soit optimisée...
Donc premièrement, pour un champ de date, il ya deux solution (si on veut les secondes), timestamp et datetime, tout le reste est à proscrire, donc ton bigint tu le ranges au placard...
Ensuite, pour les champs pseudo et mdp, des champs texte sont à éradiquer, je doute fortement que tes membres ai des pseudo de plus de 30 caractères (et encore je prend large), donc un varchar(30) (ou plus petit, il suffit de préciser aux membres d'avoir un petit pseudo) et plus adapté, et pour le mot de passe, comme on ne stocke JAMAIS un mot de passe en clair... un char(32) (taille d'un hash md5) est bien plus optimisé...
Voilou, je m'attarde pas sur le code php... tout (ou presque) à déjà été dit...
Bonne journée
Vernar Messages postés 1 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 18 décembre 2006
18 déc. 2006 à 08:27
Superbe échange entre Jean84 et Kankrelune ! C'est très positif : merci de prendre ce soin pour expliquer les errances de ce script :-))) J'apprends beaucoup à vous lire ! Il faudrait juste que Darkkrab réécrive son code en fonction de tous vos commentaires et nous le propose à nouveau, débarrassé de ses scories !
@+
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 déc. 2006 à 21:07
Cooool ! Merci pour les infos (et les liens)

@++
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
12 déc. 2006 à 16:45
Pour faire court les clé (ou index ou encore indice) servent à...

empêcher des duplicats
accélérer les recherches

il y a trois type de clés...

clé primaire => primary key
clé unique => unique key
clé candidate (ou clé tout court) => key

Une table ne peut posséder qu'une seule
clé primaire... une clé primaire c'est une clé unique
particulière... la différence se situe au
niveau du traitement des valeurs nulles...

une clé unique empêche les duplicats alors qu'une clé normale (candidate) servira à accélérer les recherches... les clés sont très utile et accèlèrent sensiblement les recherches lors de l'utilisation de la clause WHERE... cependant les clés utilisent de l'espace disque et ralentissent les insertions et parfois les modifications il faut donc les utiliser avec parcimonie...

Quelques liens...

- Comment MySQL utilise les index : http://doc.domainepublic.net/mysql/doc_mysql/mysql-indexes.html
- Index de colonnes : http://doc.domainepublic.net/mysql/doc_mysql/indexes.html
- Index sur plusieurs colonnes : http://doc.domainepublic.net/mysql/doc_mysql/multiple-column-indexes.html
- Mesures de vitesses pour comprendre les impacts sur le cluster : http://dev.mysql.com/doc/refman/5.0/fr/performance-figures.html

@ tchaOo°
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 déc. 2006 à 16:14
C'est quoi la difference entre une cle primaire et une cle unique (je n'utilise vraiment que les fonctions de bases de mysql, un coup de paluche me sera la bien venue) ?

"Effectivement... sauf que trop de vérif tue la vérif (je sais elle était facile celle là)... .."

Arf !
Un brin d'humour ne fait jamais de mal (c.f sketch les inconnus)

^^
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
12 déc. 2006 à 16:07
Effectivement... sauf que trop de vérif tue la vérif (je sais elle était facile celle là)... .. .

J'ais oublié de dire que dans l'exemple de code que je donne il faudra que la structure de la table sql comporte une clé primaire ou unique sur le champ pseudo... .. .

@ tchaOo°
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
12 déc. 2006 à 16:04
"C'est vrai que sa change rien... jsute que je trouve sa plus explicite (d'autres languages utilisent <?, donc mieux vaut prendre de bonne habitudes. D'autant qu'ils ont parle de la virer dans php6, meme si sa reste a verifier)"

Tout à fait d'accord... comme disait un membre dont je ne me souviens plus le nom... <? c'est comme "bonjour je parle" alors que <?php c'est comme "bonjour je parle français"... .. . ;o)

""a conditions suivant le mysql_query() ne sera jamais executé car le "or die()" aura terminé le script avant... .. ."

Comment sa ? Pourtant je fais toujours ainsi, jamais eu de problemes... tu peut preciser ?"

En fait je me suis mal exprimé... ton or die() s'éxécutera si le code précédent retourne false... cela revient à faire...

if(!mysql_query('bla bla))
die('bla bla');

donc avec...

$Result = mysql_query($Requete) or die('blabla');
if ( $Result !== FALSE )
{

le...

if ( $Result !== FALSE )

ne sera jamais éxécuté si $Result vaut false cart le die() aura mis un terme à l'execution du script... par contre il le sera si $Result vaut true (ou équivalant) et à ce moment là le if($Result !== false) est inutile puisque $Result vaut forcement autre chose que false... .. .

@ tchaOo°
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 déc. 2006 à 16:02
je viens de comprendre... si jamais il y avait une erreur dans mysql, sa serait le die() qui aurait attrape l'erreur et pas mon $Result... effectivement je n'y avais pas pense sur le coup. M'enfin mieux vaut trop de verifs que pas assez ^^

Merci Kankrelune !
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 déc. 2006 à 15:55
"<? n'est ni plus rapide ni plus lent que <?php c'est juste que la deuxième solution est portable sous toutes les configuration de php que short_open_tags soit activé ou non... .. ."

C'est vrai que sa change rien... jsute que je trouve sa plus explicite (d'autres languages utilisent <?, donc mieux vaut prendre de bonne habitudes. D'autant qu'ils ont parle de la virer dans php6, meme si sa reste a verifier)

"a conditions suivant le mysql_query() ne sera jamais executé car le "or die()" aura terminé le script avant... .. ."

Comment sa ? Pourtant je fais toujours ainsi, jamais eu de problemes... tu peut preciser ?
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
12 déc. 2006 à 15:45
Pas grand chose à rajouter à ce qu'a dit jean84 hormis quelques précisions... .. .

<? n'est ni plus rapide ni plus lent que <?php c'est juste que la deuxième solution est portable sous toutes les configuration de php que short_open_tags soit activé ou non... .. .

mysql_query() peut retourner true mais pas dans le cas d'un select comme avec le code ci dessus... .. .

Sinon...

$Result = mysql_query($Requete) or die('blabla');
if ( $Result !== FALSE )
{

la conditions suivant le mysql_query() ne sera jamais executé car le "or die()" aura terminé le script avant... .. .

...

if ($_SESSION['pseudo'] != '')

Et si $_SESSION['pseudo'] n'est pas initialisé... .. ?

Mieux vaut faire...

if(isset($_SESSION['pseudo']) && !empty($_SESSION['pseudo']))

Concernant la table sql il faut tout remettre dans son contexte... en effet il serait peu judicieux de créer une table pour le compteur si vous gérez les sessions via une SGDB dans ce cas autant ce servir de la table servant pour les session... .. .

Pour finir en l'état ton select est inutile... de même que j'ais du mal à comprendre à quoi sert ton update si tu ne fais pas d'insertion au préalable... il faut optimiser tout ça... je pense qu'utiliser ON DUPLICATE KEY UPDATE te permettrait de gagner une requete... qui plus est tu ne netoie jamais ta table imagine le bordel au bout d'un mois... dans le genre tu pourrais faire... .. .

include("db_connect.php"); //Infos de connexion et connexion à la bdd
$limit 10; // nombre max de connectés à afficher (0 tous)

if(isset($_SESSION['pseudo']) && !empty($_SESSION['pseudo']))
{
$pseudo = mysql_real_escape_string($_SESSION['pseudo']);
mysql_query('DELETE FROM registered_users WHERE lastquerytime < NOW()-3600'); // Garbage collector des entrées inactive depuis plus d'1 heure
mysql_query('INSERT INTO table (pseudo,lastquerytime) VALUES (\''.$pseudo.'\',NOW()) ON DUPLICATE KEY UPDATE lastquerytime=NOW()');
}

$result = mysql_query('SELECT pseudo FROM registered_users WHERE lastquerytime > NOW()-300');
$i = 0;
$nbConnected = mysql_num_rows($result);

if($nbConnected > 0)
{
$sep ($nbConnected 1) ? '' : 's';
echo 'Membre'.$sep.' connecté'.$sep.' : ';

while(false !($row mysql_fetch_assoc($result)))
{
if(!empty($limit) && $i++ == $limit)
break;

echo '<li>'.$row['pseudo'].'</li>';
}

echo '';
}
else echo 'Aucun membre n\'est actuellement connecté';

J'ais pas testé la syntaxe SQL est à vérifier et peut être optimisable mais l'idée est là... .. .

@ tchaOo°
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
12 déc. 2006 à 12:50
Hello

Je suis en train d'ecrire mon site en ce moment et il m'est arrive la meme chose, a savoir comment avoir un truc fiable pour pas beaucoup de ligne sans surcharger la base de donnees.
De mon point de vue, sachant qu'il s'agit juste d'un petit compteur sans grande pretention, j'ai opte pour les cookies auquel je greffe un timestanp et une petite table speciale avec juste 3 champs (id, pseudo, timestanp). Rien de bien mechant en somme (en gros, pas quelque chose qui justifie le niveau initie ^^)

Pour ton code, je suis d'accord avec coucou747 a savoir qu'il n'est franchement pas optimise, a commence par la balise <? (au lieu de <?php), les " a la place des ', tes balises orphelines (
au lieu de
, on est passe a xHTML depuis quelque temps deja ...). Ce ne sont que des details mais a plus grande echelle, sa peut avoir une incidence sur le temps d'execution de ton code.

Ensuite, et la par contre sa fait un peu plus mal aux yeux, c'est ton
pseud = $_SESSION['pseudo'];
$query = "SELECT * FROM registered_users WHERE pseudo='$pseudo'"; //On récupère ses infos dans la bdd
$result = mysql_query($query);

Je sais pas pour les autres mais moi sa m'a franchement choque. Deja, il y a une faute pour la variable $pseudo que tu appelles $pseud = $_SESSION[]... . Si j'avais fait un copie/coller comme tu l'indiques, j'aurais pu me brosser avant de faire fonctionner ton code.
Ensuite, mysql_query() retroune une ressource en cas de succes et FALSE en cas d'erreur, jamais TRUE. Donc faire
if ( mysql_query() )
et un abus de language (je remercie Kankrelune pour sa ;-) ).
La correction serait plus du type :
$Result = mysql_query($Requete) or die('blabla');
if ( $Result !== FALSE )
{
// a ce moment on rentre dans le if()
}

Voici la documentation de mysql_query() si tu veux plus d'informations => http://fr.php.net/manual/fr/function.mysql-query.php

Ensuite, petite suggestion :
tu declares : si mysql_query() me renvoi une ressource, c'est qu'il y a une entree dans la base de donnees. C'est faux ! mysql_query() renverra toujours une ressource, meme si la base est vide. C'est en cas d'erreur SQL qu'il te renverra FALSE (erreur de syntaxe par exemple)
Il serait plus judicieux de verifier le nombre de resultat avec un mysql_num_rows() qui elle, te renverra le nombre de d'entree liste par MySQL, pas simplement une ressource...

Et pour la derniere partie, 2/3 petites choses (c'est pour ton bien m'en veut pas) :

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

Prefere l'utilisation de mysql_fetch_assoc() au cas ou tu n'utilises pas les cles associatives ni les index de mysql_fetch_array(), tu gagneras en vitesse de traitement.
Pour le while, meme reflexion que pour mysql_query(), mysql_fetch_assoc() (ou fetch_array()) te renverra un tableau ou FALSE en cas d'erreur, jamais TRUE. Utilise plutot

while ( ($Array = mysql_fetch_assoc($Result)) !== FALSE )
{
// blabla
}

qui sera plus rapide et plus sûr.
LIENS :
http://fr.php.net/manual/fr/function.mysql-fetch-assoc.php
http://fr.php.net/manual/fr/function.mysql-fetch-array.php

Et pour ton
echo $row[0]."
";
prefere
echo $row[0], '
';
Cela ne sert a rien de concatener une chaine si elle part tout de suite a l'affichage...

En esperant que tu continues ton apprentissage malgre tout cela,

@++
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
11 déc. 2006 à 17:27
"De plus il faut sans cesse mettre cette table ou ces fichiers texte à jour."

Ah... parce que c'est pas ce que tu fais toi... .. ?

Ou est le niveau initié dans cette source... .. ?

@ tchaOo°
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 déc. 2006 à 09:22
entre nous, ton code n'est pas propre, et moins optimisé que celui d'antho qui stoquait tout ça sur une table HEAP...

De plus, 50 lignes, c'est un hello world... pas un gros code
Rejoignez-nous