malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 2009
-
13 janv. 2008 à 16:53
cs_Vyk12
Messages postés18Date d'inscriptiondimanche 2 septembre 2007StatutMembreDernière intervention27 juin 2008
-
7 avril 2008 à 20:35
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Vyk12
Messages postés18Date d'inscriptiondimanche 2 septembre 2007StatutMembreDernière intervention27 juin 2008 7 avril 2008 à 20:35
Voilà j'ai modifié, comme ça ça règle les 2 problèmes : plus besoin des IP des visiteurs et si ça bug pour le onunload, la session se détruit automatiquement au bout de quelques minutes ...
J'espère que je ne me trompe pas en ce qui concerne la durée de vie des sessions sinon j'ai plus qu'à remodifier !
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 7 avril 2008 à 19:08
Salut,
Pour le problème d'ip ajouter un cookie(ou une variable de session) à la vérification ça réduit déja la marge d'erreur.
Pour les deux valeurs dont tu parles si tu n'es pas derrière un proxy alors elle ne retourne rien. bref si elle retourne quelques choses tu devrait les utiliser plutot que REMOTE_ADDR pour avoir la vrai IP du client.
Pour le timeout mmm je le metterais un peu plus court. En fait tu devrais le mettre paramétrable, si quelqu'un veut le changer :)
Bonne continuation :)
cs_Vyk12
Messages postés18Date d'inscriptiondimanche 2 septembre 2007StatutMembreDernière intervention27 juin 2008 7 avril 2008 à 18:20
Bonjour,
Bon alors oui s'il y a des bugs sur le navigateur il est connecté pour toujours ... je vais rajouter un timestamp qui détruira l'ip au bout de ... 20 minutes ??
Sinon pour les adresses IP, ok ce n'est pas précis (par exemple j'ai la même IP que ma soeur, autre ordinateur) mais comment faire pour différencier chaque personnes ?????
J'ai lu les autres commentaires :
$_SERVER['HTTP_X_FORWARDED_FOR'] et $_SERVER['HTTP_CLIENT_IP']
J'ai essayé de faire un echo de ces 2 variables mais les 2 ne m'affichent rien !!!
Donc pour résumé, mon script a 2 "bugs" :
- Si le navigateur bug ==> visiteur connecté pour toujours (je vais rajouter un timestamp)
- Trop imprécis à cause des IP : que me proposez-vous ?
Merci à toute réponse !!!
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 6 avril 2008 à 22:04
Personne ne te force à lire mes commentaires Gilles.
Pourquoi poste t'il une source ? Pour recevoir plein de louanges et de félicitations ? Ou pour qu'on commente afin qu'il s'améliore ?
Quand on poste une source il faut être prêt à prendre tout genre de commentaire. Je donne des conseils et je fais des critiques constructives. Certe ça peut paraitre dur mais je ne dénigre personne, je n'insulte personne et crois moi je ne prenderais pas mon temps à lire un code et à le commenter si je pensais que ça n'aiderait pas l'auteur. Et par dessus tout je ne force personne à lire/suivre mes conseils.
Phpcs est un site d'entraide, de partage et de connaissance; ce qui veut dire que :
1. ça ne sert à rien de reposter les même sources encore et encore.
2. On ne s'approprient pas le travail d'autrui.
3. Si un auteur poste une source c'est pour entendre les critiques/commentaires.
Alors je peux savoir ce qui te dérange ?
GillesWebmaster
Messages postés496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 6 avril 2008 à 21:49
Vous êtes vraiment acariâtres avec les nouveaux!
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 6 avril 2008 à 21:38
Salut,
J'viens de lire la source et j'ai pas pigé en quoi il est plus précis ? Certe il est mis à jour via ajax, mais tu continue à juste compter par IP quand même donc la marge d'erreur est toujours très large.
BOn okay tu ne base plus une visite sur une durée, mais plutot tant que la page n'est pas fermé. L'idée est bonne mais si le navigateur plante ou ne renvoit juste pas le onunload alors quoi, l'utilisateur est connecté pour toujours ?
Ton code php est redondant et peut être largement optimisé en terme de nombre de ligne, ceci dit c'est une bonne chose que ce code soit maintenant entièrement de toi et je te souhaite une bonne continuation.
GillesWebmaster
Messages postés496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 6 avril 2008 à 21:01
Quelle bonne idée...
Bonne soirée
cs_Vyk12
Messages postés18Date d'inscriptiondimanche 2 septembre 2007StatutMembreDernière intervention27 juin 2008 6 avril 2008 à 20:43
Voilà j'ai modifié tout le code source, ici le compteur est beacoup plus précis et il a été créé totalement par moi !
GillesWebmaster
Messages postés496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 28 mars 2008 à 12:22
Oé c'est clair, mais bon personne ne va réinventer la roue!
Masarusa
Messages postés1Date d'inscriptionvendredi 28 mars 2008StatutMembreDernière intervention28 mars 2008 28 mars 2008 à 11:49
Oui gilles t'a raison c'est cool d'aller chercher des codes sur d'autre site et de les taper en mettant en debut de code : // Script réaliser par Vyk12
Je trouve pas ca très honnete.
Si limite il l'avait présenté en disant :
"j'ai trouver un bon code sur un autre site qui..."
ou tout simplement en ne se l'appropriant pas ca aurais déja été mieux.
Sinon je remercie Matèo21 du SiteDuZero d'ou est tiré ce code pour son tuto, sa oui.
GillesWebmaster
Messages postés496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 27 mars 2008 à 12:27
Arrêtez de cracher dans la soupe, certes ce code est connu, mais il reste très efficace et son auteur a tout à fait raison de le diffuser!!!
zoukozouko
Messages postés148Date d'inscriptiondimanche 25 janvier 2004StatutMembreDernière intervention21 janvier 2009 31 janv. 2008 à 13:05
De très curieuses ressemblances tout de même... lol
enfin, peu importe que la source soit de toi, vu que CS n'est pas un site d'awards de la meilleure (moin bonne) source.
Je trouve l'utilisation de la base très lourde.
Essai de voir si tu peux pas faire la même chose avec un simple fichier.
(La table étant elle -même un fichier, tu économiserais un paquet de requêtes, connxions, etc...)
sankasssss
Messages postés12Date d'inscriptionlundi 15 janvier 2007StatutMembreDernière intervention28 janvier 2008 28 janv. 2008 à 10:51
Bah c'est vrais que tu ne l'a pas copié, mais c'est quand même un fameux plagia...
L'idée reste à 200% la même.
Tu aurais du essayer de trouver des améliorations à y mettre et nous présenté un contenu différent de celui du SdZ.
Essaye de le modifier avec les idées donné plus haut, ca serais plus sympa ;)
cs_Vyk12
Messages postés18Date d'inscriptiondimanche 2 septembre 2007StatutMembreDernière intervention27 juin 2008 21 janv. 2008 à 19:42
mais vous croyez que je copierais des sources pour le fun ?
J'ai juste appris le PHP sur le siteduzero, donc j'ai son style pour le moment, c'est normal que nos scripts se ressemblent <_<'
le script du siteduzero est très bien, et au début (regardez les premiers commentaires) mon script avait quelques erreurs, je n'ai donc pas fait de copier/coller
merci de réfléchir et de bien regarder avant d'accuser à torts et à travers
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 21 janv. 2008 à 18:34
Oulala copier une source extremement mal faite à la base et dire qu'elle est de nous.... faut le faire hein ;).
ThePilot
Messages postés25Date d'inscriptionsamedi 10 juin 2006StatutMembreDernière intervention21 janvier 2008 21 janv. 2008 à 18:08
xaraan
Messages postés6Date d'inscriptiondimanche 23 décembre 2007StatutMembreDernière intervention14 janvier 2008 14 janv. 2008 à 18:03
Quelques remarques :
1) Comme l'a dit Webdeb, il ne vaut mieux pas utiliser $_SERVER['REMOTE_ADDR']. Je me pencherais sur un autre problème avec cette variable. Si le serveur "transfert" la requête (ce qui est le cas pour les clusters et la gestion de load balancing) alors l'adresse IP de $_SERVER['REMOTE_ADDR'] ne sera pas la bonne. Tu dois utiliser de préférence HTTP_X_FORWARDED_FOR, puis HTTP_CLIENT_IP et finalement REMOTE_ADDR.
2) La modélisation de ta table n'est pas bonne ! Mis à part le problème souligné par Yoman64, on considère (pour ton script) que 1 IP = 1 utilisateur. Tu dois alors marquer l'unicité de l'adresse IP en la définissant comme clé primaire par exemple, ou en ajoutant une contrainte "unique". Tu y gagneras lors des opérations de sélection (par exemple) puisque ton champ est indexé, ce qui stoppera le parcourt de la table si le tuple est trouvé !
3) Le meilleur moyen de ne pas s'embrouiller avec les fonctions mysql est d'utiliser PDO. PHP nous offre cet excellant outil, autant l'utiliser ! D'autant plus qu'il est portable d'un serveur à un autre indépendamment de la base de données pour des requêtes simples !
4) Mêmes remarques que plus haut.
webdeb
Messages postés488Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention31 mars 20094 14 janv. 2008 à 12:51
1/ Il faut filtrer $_SERVER['REMOTE_ADDR'] car c'est une donnée fournie par le navigateur. Il faut donc s'assurer qu'elle contient bien une IP V4 ou bien une IP V6 avant. Pour ça, PHP propose des fonctions dans la doc.
2/ Evite le SELECT * et liste tes champs
3/ Remplace mysql_fetch_array() par mysql_fetch_assoc()
4/ Récupère le timestamp avec $_SERVER['REQUEST_TIME'] car c'est beaucoup plus rapide qu'un appel à une fonction
5/ Supprime ces horribles or die()...
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 13 janv. 2008 à 20:23
J'oubliais : $expire = $timestamp + 60 * 5;
Pourquoi pas faire +300 directement ? et le premier or die : OR DIE (mysql_connect());
C'est pas plutot or die(mysql_error()); ? En fait pour un bête compteur tu devrais évité les hors die qui pourrait paralyser tout un site juste parce que le compteur déconne...
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 13 janv. 2008 à 20:19
Salut,
Moi je pense que c'est une erreur de se baser uniquement sur le ip pour définir un utilisateur, tu devrais utiliser un témoin (cookie ou une session) contenant un unique id couplé a son ip ça serait une méthode fiable de définir un utilisateur.
Par exemple chez moi il y a une dizaine de PC, si mon frère et moi allons sur le site, nous allons être vu comme un seul visiteur.
Dans un café internet, ou dans un "centre internet" ou encore dans les écoles il est fort probable que plusieurs dizaines voir centaines de PC ait la meme addresse IP.
Ensuite completement inutile de récuperer les données de la première requete, un simple mysql_num_rows sauverait des ressources que tu alloue inutilement d'après moi...
Pas besoin d'un fetch array à la fin, tu récupere une seule valeure, utilise mysql_result, ou mysql_fetch_assoc si tu y tiens , mais je ne crois pas que tu es besoin de tout le tableau...
Et un dernier conseil (mais je ne suis pas sur pour celui ci, un expert le confirmera, ou l'infirmera) : En fait tu devrais même betement utilisé un champ unique pour le ip, et ensuite d'essayer un INSERT, et de "catcher" lerreur afin de faire un update si l'entré existait(erreur 1062 si ma mémoire est bonne). Si l'ip existait pas tu sauve une requete, si le ip existait tu fais deux requete... donc tu sauve des requetes.
Bonne continuation à toi ,et courage !
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 13 janv. 2008 à 18:48
Oui, maintenant que tu as corrigé le code en remplaçant le "=" par un ">" !!
cs_Vyk12
Messages postés18Date d'inscriptiondimanche 2 septembre 2007StatutMembreDernière intervention27 juin 2008 13 janv. 2008 à 18:46
Non, il ne sera pas considéré comme nouveau visiteur à chaque clique car si son IP est déjà dans la BDD, il ne sera pas pris en compte (seul son timestamp sera donc mis à jour) ;)
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 13 janv. 2008 à 16:53
Salut,
euh... bon, ben déjà vu 450 fois, mais pourquoi pas...
"et d'inclure ce fichier dans toutes vos pages" + "$expire $timestamp + 60 * 5;"> un visiteur qui passe moins de 5 minutes sur une page (ce qui est la plupart du temps le cas) sera systématiquement considéré comme un nouveau visiteur à chaque clic dans ton site!
mysql_query("DELETE FROM connectes WHERE timestamp='$expire'") => si on ne tombe pas EXACTEMENT 300 secondes après l'entrée dans le site, cette requête n'aura pas lieu et l'IP ne sera pas effacée => tu auras des vieilles IPs toujours dans ta base...
Que se passe-t-il si ta table est vide? J'ai l'impression que cela donnera des messages d'erreur...
7 avril 2008 à 20:35
J'espère que je ne me trompe pas en ce qui concerne la durée de vie des sessions sinon j'ai plus qu'à remodifier !
7 avril 2008 à 19:08
Pour le problème d'ip ajouter un cookie(ou une variable de session) à la vérification ça réduit déja la marge d'erreur.
Pour les deux valeurs dont tu parles si tu n'es pas derrière un proxy alors elle ne retourne rien. bref si elle retourne quelques choses tu devrait les utiliser plutot que REMOTE_ADDR pour avoir la vrai IP du client.
Pour le timeout mmm je le metterais un peu plus court. En fait tu devrais le mettre paramétrable, si quelqu'un veut le changer :)
Bonne continuation :)
7 avril 2008 à 18:20
Bon alors oui s'il y a des bugs sur le navigateur il est connecté pour toujours ... je vais rajouter un timestamp qui détruira l'ip au bout de ... 20 minutes ??
Sinon pour les adresses IP, ok ce n'est pas précis (par exemple j'ai la même IP que ma soeur, autre ordinateur) mais comment faire pour différencier chaque personnes ?????
J'ai lu les autres commentaires :
$_SERVER['HTTP_X_FORWARDED_FOR'] et $_SERVER['HTTP_CLIENT_IP']
J'ai essayé de faire un echo de ces 2 variables mais les 2 ne m'affichent rien !!!
Donc pour résumé, mon script a 2 "bugs" :
- Si le navigateur bug ==> visiteur connecté pour toujours (je vais rajouter un timestamp)
- Trop imprécis à cause des IP : que me proposez-vous ?
Merci à toute réponse !!!
6 avril 2008 à 22:04
Pourquoi poste t'il une source ? Pour recevoir plein de louanges et de félicitations ? Ou pour qu'on commente afin qu'il s'améliore ?
Quand on poste une source il faut être prêt à prendre tout genre de commentaire. Je donne des conseils et je fais des critiques constructives. Certe ça peut paraitre dur mais je ne dénigre personne, je n'insulte personne et crois moi je ne prenderais pas mon temps à lire un code et à le commenter si je pensais que ça n'aiderait pas l'auteur. Et par dessus tout je ne force personne à lire/suivre mes conseils.
Phpcs est un site d'entraide, de partage et de connaissance; ce qui veut dire que :
1. ça ne sert à rien de reposter les même sources encore et encore.
2. On ne s'approprient pas le travail d'autrui.
3. Si un auteur poste une source c'est pour entendre les critiques/commentaires.
Alors je peux savoir ce qui te dérange ?
6 avril 2008 à 21:49
6 avril 2008 à 21:38
J'viens de lire la source et j'ai pas pigé en quoi il est plus précis ? Certe il est mis à jour via ajax, mais tu continue à juste compter par IP quand même donc la marge d'erreur est toujours très large.
BOn okay tu ne base plus une visite sur une durée, mais plutot tant que la page n'est pas fermé. L'idée est bonne mais si le navigateur plante ou ne renvoit juste pas le onunload alors quoi, l'utilisateur est connecté pour toujours ?
Ton code php est redondant et peut être largement optimisé en terme de nombre de ligne, ceci dit c'est une bonne chose que ce code soit maintenant entièrement de toi et je te souhaite une bonne continuation.
6 avril 2008 à 21:01
Bonne soirée
6 avril 2008 à 20:43
28 mars 2008 à 12:22
28 mars 2008 à 11:49
Je trouve pas ca très honnete.
Si limite il l'avait présenté en disant :
"j'ai trouver un bon code sur un autre site qui..."
ou tout simplement en ne se l'appropriant pas ca aurais déja été mieux.
Sinon je remercie Matèo21 du SiteDuZero d'ou est tiré ce code pour son tuto, sa oui.
27 mars 2008 à 12:27
31 janv. 2008 à 13:05
enfin, peu importe que la source soit de toi, vu que CS n'est pas un site d'awards de la meilleure (moin bonne) source.
Je trouve l'utilisation de la base très lourde.
Essai de voir si tu peux pas faire la même chose avec un simple fichier.
(La table étant elle -même un fichier, tu économiserais un paquet de requêtes, connxions, etc...)
28 janv. 2008 à 10:51
L'idée reste à 200% la même.
Tu aurais du essayer de trouver des améliorations à y mettre et nous présenté un contenu différent de celui du SdZ.
Essaye de le modifier avec les idées donné plus haut, ca serais plus sympa ;)
21 janv. 2008 à 19:42
J'ai juste appris le PHP sur le siteduzero, donc j'ai son style pour le moment, c'est normal que nos scripts se ressemblent <_<'
le script du siteduzero est très bien, et au début (regardez les premiers commentaires) mon script avait quelques erreurs, je n'ai donc pas fait de copier/coller
merci de réfléchir et de bien regarder avant d'accuser à torts et à travers
21 janv. 2008 à 18:34
21 janv. 2008 à 18:08
http://www.siteduzero.com/tuto-3-174-1-tp-nombre-de-visiteurs-connectes.html#ss_part_1
-> Quasiment identique à la source du SDZ ;)
14 janv. 2008 à 18:03
1) Comme l'a dit Webdeb, il ne vaut mieux pas utiliser $_SERVER['REMOTE_ADDR']. Je me pencherais sur un autre problème avec cette variable. Si le serveur "transfert" la requête (ce qui est le cas pour les clusters et la gestion de load balancing) alors l'adresse IP de $_SERVER['REMOTE_ADDR'] ne sera pas la bonne. Tu dois utiliser de préférence HTTP_X_FORWARDED_FOR, puis HTTP_CLIENT_IP et finalement REMOTE_ADDR.
2) La modélisation de ta table n'est pas bonne ! Mis à part le problème souligné par Yoman64, on considère (pour ton script) que 1 IP = 1 utilisateur. Tu dois alors marquer l'unicité de l'adresse IP en la définissant comme clé primaire par exemple, ou en ajoutant une contrainte "unique". Tu y gagneras lors des opérations de sélection (par exemple) puisque ton champ est indexé, ce qui stoppera le parcourt de la table si le tuple est trouvé !
3) Le meilleur moyen de ne pas s'embrouiller avec les fonctions mysql est d'utiliser PDO. PHP nous offre cet excellant outil, autant l'utiliser ! D'autant plus qu'il est portable d'un serveur à un autre indépendamment de la base de données pour des requêtes simples !
4) Mêmes remarques que plus haut.
14 janv. 2008 à 12:51
2/ Evite le SELECT * et liste tes champs
3/ Remplace mysql_fetch_array() par mysql_fetch_assoc()
4/ Récupère le timestamp avec $_SERVER['REQUEST_TIME'] car c'est beaucoup plus rapide qu'un appel à une fonction
5/ Supprime ces horribles or die()...
13 janv. 2008 à 20:23
Pourquoi pas faire +300 directement ? et le premier or die : OR DIE (mysql_connect());
C'est pas plutot or die(mysql_error()); ? En fait pour un bête compteur tu devrais évité les hors die qui pourrait paralyser tout un site juste parce que le compteur déconne...
13 janv. 2008 à 20:19
Moi je pense que c'est une erreur de se baser uniquement sur le ip pour définir un utilisateur, tu devrais utiliser un témoin (cookie ou une session) contenant un unique id couplé a son ip ça serait une méthode fiable de définir un utilisateur.
Par exemple chez moi il y a une dizaine de PC, si mon frère et moi allons sur le site, nous allons être vu comme un seul visiteur.
Dans un café internet, ou dans un "centre internet" ou encore dans les écoles il est fort probable que plusieurs dizaines voir centaines de PC ait la meme addresse IP.
Ensuite completement inutile de récuperer les données de la première requete, un simple mysql_num_rows sauverait des ressources que tu alloue inutilement d'après moi...
Pas besoin d'un fetch array à la fin, tu récupere une seule valeure, utilise mysql_result, ou mysql_fetch_assoc si tu y tiens , mais je ne crois pas que tu es besoin de tout le tableau...
Et un dernier conseil (mais je ne suis pas sur pour celui ci, un expert le confirmera, ou l'infirmera) : En fait tu devrais même betement utilisé un champ unique pour le ip, et ensuite d'essayer un INSERT, et de "catcher" lerreur afin de faire un update si l'entré existait(erreur 1062 si ma mémoire est bonne). Si l'ip existait pas tu sauve une requete, si le ip existait tu fais deux requete... donc tu sauve des requetes.
Bonne continuation à toi ,et courage !
13 janv. 2008 à 18:48
13 janv. 2008 à 18:46
13 janv. 2008 à 16:53
euh... bon, ben déjà vu 450 fois, mais pourquoi pas...
"et d'inclure ce fichier dans toutes vos pages" + "$expire $timestamp + 60 * 5;"> un visiteur qui passe moins de 5 minutes sur une page (ce qui est la plupart du temps le cas) sera systématiquement considéré comme un nouveau visiteur à chaque clic dans ton site!
mysql_query("DELETE FROM connectes WHERE timestamp='$expire'") => si on ne tombe pas EXACTEMENT 300 secondes après l'entrée dans le site, cette requête n'aura pas lieu et l'IP ne sera pas effacée => tu auras des vieilles IPs toujours dans ta base...
Que se passe-t-il si ta table est vide? J'ai l'impression que cela donnera des messages d'erreur...
Bye