COMPTEUR PAR VISITES ET PAR PAGES

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 4 févr. 2006 à 18:47
tayeress Messages postés 1 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 28 février 2008 - 28 févr. 2008 à 20:10
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/35889-compteur-par-visites-et-par-pages

tayeress Messages postés 1 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 28 février 2008
28 févr. 2008 à 20:10
Pareillement que kilikiki43 . Ce code m'intéresse beaucoup. Je suis débutant dans le codage PHP. D'après ce que j'ai vue, cette erreur est due à un problème de remplissage de la bdd (trop de valeur pour pas assez de table). J'ai bien regarder ce code mais je vois pas où est l'erreur.
Si quelqu'un connait la solution je suis preneur à 200% car ce code est vraiment ce dont j'ai besoin pour mon projet
Merci d'avance
kilikiki43 Messages postés 1 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 14 septembre 2007
14 sept. 2007 à 02:49
Je ne veux pas être méchant mais rien ne fonctionne.
J'ai créé la db ajouté le script dans un include le premier me met une erreur : column count doesn't matchrow 1...
L'autre pas d'erreur mais pas d'enregistrement non plus.

Mes branchements sont pourtant ok j'ai mis cpt_page et ip en clef primaire. Not nuul pour tous les champs. Aucun auto increment.

Quelq'un a ce script qui fonctionne ? Si oui merci de le transmettre.

Sinon ce script me semble intéressant pour pister certains ordi.
RaphAstronome Messages postés 104 Date d'inscription samedi 7 décembre 2002 Statut Membre Dernière intervention 17 août 2009
4 mai 2006 à 20:23
Il y a moyen aussi le mettre le CRC de l'IP c'est compact et toujours de la même taille. Le risque de collision reste faible.

Et en plus pas besoin de s'inscrire a la CNIL comme ça, enfin je crois.

Ne pas oublier de supprimer les IP vieilles de plus de 24h car d'habitude c'est le temps de conservation de l'IP (si dynamique).
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
4 mai 2006 à 17:13
Un COUNT(*) est directement stocké dans la table, y'a pas plus rapide que ça (enfin dans le cas précis, faut pas mettre de WHERE dans la condition).

Pour un compteur plus précis, y'a le mien qui supprime le dernier octet de l'ip.
cs_Ricou13 Messages postés 40 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 septembre 2006
4 mai 2006 à 16:36
D'où ma question sur l'intérêt ?

C'est pas parce qu'on a l'ADSL qu'on est forcement connecté 24h/24h.
L'IP change donc régulièrement !
b4ng Messages postés 9 Date d'inscription samedi 24 avril 2004 Statut Membre Dernière intervention 7 février 2011
4 mai 2006 à 16:18
pour etre encore plus rapide tu fais un SELECT COUNT(1)

mais bon ton code n'est pas très fiable puisque des l'instant où les utilisateurs passent par un proxy ou change d'ip tout le temps (56k par exemple ou ADSL avec renouvellement d'ip journalier) , ils sont mal comptabilisés
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
9 févr. 2006 à 11:31
# // Recherche si le visiteur est déjà dans la base de données
# $query = "SELECT * FROM cpt_visiteur WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND date='".date("Y-m-d")."'";
# $req = @mysql_query($query) or die('Erreur : '.mysql_error());
# // Si il n'y est pas
# if( @mysql_num_rows($req) == 0 )
# {
# // Ajoute son IP et la date de visite dans la base de données
# $query = "INSERT INTO cpt_visiteur VALUES('','".$_SERVER['REMOTE_ADDR']."','".date("Y-m-d")."','1')";
# $req = @mysql_query($query) or die('Erreur : '.mysql_error());
# }
# else
# {
# // Sinon incrémente son nombre visite
# $data = @mysql_fetch_array($req);
# $data[3]++;
# $query = "UPDATE cpt_visiteur SET nbpage='".$data[3]."' WHERE ip='".$_SERVER['REMOTE_ADDR']."' AND date='".$data[2]."'";
# @mysql_query($query) or die('Erreur : '.mysql_error());
# }

doit surement être remplaçable par une seule requête en REPLACE INTO table machin...

# // Recherche si la page a déjà été visitée
# $query = "SELECT * FROM cpt_page WHERE page='".$_SERVER['REQUEST_URI']."'";
# $req = @mysql_query($query) or die('Erreur : '.mysql_error());
# // Si elle a déjà été vu
# if( mysql_num_rows($req)!= 0 )
# {
# // Incrémente le nombre de visite de cette page
# $data = @mysql_fetch_array($req);
# $data[1]++;
# $query = "UPDATE cpt_page SET nbr='".$data[1]."' WHERE page='".$data[0]."'";
# @mysql_query($query) or die('Erreur : '.mysql_error());
# }
# else
# {
# // Sinon ajoue la page à la base de données
# $query = "INSERT INTO cpt_page VALUES('".$_SERVER['REQUEST_URI']."','1')";
# @mysql_query($query) or die('Erreur : '.mysql_error());
# }

idem pour ça... au passage pas de SELECT * (idem que ci dessus)

# // Compte combien il y a de visiteur dans la table
# $query = "SELECT id FROM cpt_visiteur";
# $req = @mysql_query($query) or die('Erreur : '.mysql_error());
#
# echo @mysql_num_rows($req); // Affiche le nombe de visiteur

un SELECT COUNT(*) FROM cpt_visiteur sera largement plus rapide. suivi d'un $r=mysql_fetch_row($req) et pour la valeur echo $r[0];
cs_Ricou13 Messages postés 40 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 8 septembre 2006
9 févr. 2006 à 10:59
Quel est l'intéret de comptabiliser le nombre de page visitée par un internaute sachant que son IP risque de changer à chaque visite, voire qu'elle soit attribuée à un autre ?
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 févr. 2006 à 21:32
ou deux entiers... et pas un entier de 128, car t'auras 6 caractères soit : 6*8 bits = 48, or un int c'est 32, et tu peux tennir jusquen ipv8 avec deux entiers...
RaphAstronome Messages postés 104 Date d'inscription samedi 7 décembre 2002 Statut Membre Dernière intervention 17 août 2009
8 févr. 2006 à 21:28
Pour l'IP v6 (forme : 0000:0000:0000:0000:0000:0000:0000:0000) il faudra mettre VARCHAR(40) ou un entier 128 bits.

Toujours bon à prendre en compte.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
7 févr. 2006 à 20:49
GRenard, merci pour cette fonction.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
7 févr. 2006 à 16:25
tiens pas mal cette fonction, en plus c'est deux fois plus rapide que l'explode + mise en INT, donc c'est nickel.
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
7 févr. 2006 à 13:04
ip2long
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2006 à 17:51
ouais, à la limite... tfaçon, le principe est là...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
5 févr. 2006 à 17:30
enlève-moi ces intval() lol vu le typage de PHP c'est inutile et plus gourmand (intval() est une fonction hyper gourmande).
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2006 à 14:22
mais vous savez convertire une chaine en nombre ?
franchement :

a.b.c.d ou a, b, c et d sont des nombres compris entre 0 et 255, on peut faire tennir ça sur un INT car : a, b, c et d tiennent sur 8 bits et un int sur 32 !

donc :

$ip=explode('.',$_SERVER['REMOTE_ADDR']);
$ip=intval($ip[0]) *256*256*256 +intval($ip[1]) *256*256+ intval($ip[2]) *256+ intval($ip[3]);

et hop, ça passe en INT UNSIGNED dans la table SQL, ce qui fait 4 octets !
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
4 févr. 2006 à 23:41
Salut,

évite le SELECT *, n'oublie pas les index sur ta table car ça va craindre niveau perfs après un mois de remplissage...

je matterai le code demain en profondeur car j'ai pas trop le temps là (ni l'envie vu l'heure)
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
4 févr. 2006 à 22:51
en fait j'aurais pu mettre VARCHAR(16), une ip indiquer comme ci xxx.xxx.xxx.xxx est une chaine de caractère et non un nombre. De plus c'est une chaine de 15 caractères, donc VARCHAR(20) suffit très amplement (j'aurai pu prendre VARCHAR(15)).
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 févr. 2006 à 18:54
mais pourquoi tu passe ça en varchar ??? un int unsigned ça ne te convient pas ????
cs_Arkko Messages postés 192 Date d'inscription mercredi 26 décembre 2001 Statut Membre Dernière intervention 31 janvier 2007
4 févr. 2006 à 18:52
Coucou747 > peut-être qu'un ip c'est 4 octets mais en varchar c'est 19 caracteres
xxx.xxx.xxx.xxx
cs_Arkko Messages postés 192 Date d'inscription mercredi 26 décembre 2001 Statut Membre Dernière intervention 31 janvier 2007
4 févr. 2006 à 18:52
Coucou747 > peut-être qu'un ip c'est 4 octets mais en varchar c'est 19 caracteres
xxx.xxx.xxx.xxx
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 févr. 2006 à 18:47
salut
j'ai pas lu grandchose mais :

ip VARCHAR(20)

c'est 5 fois trop 20 octets pour une ip... une ip c'est 4 octets...
Rejoignez-nous