Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMPTEUR PAR VISITES ET PAR PAGES


Information sur la source

Catégorie :Base de données Classé sous : compteur, base, données, page, visite Niveau : Débutant Date de création : 04/02/2006 Vu : 7 313

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

Description

C'est un compteur des plus simple. Il comptabilise les nombre de pages visitées par l'internaute, et il comptabilise le nombre de visites de chaques pages. Si la page n'a pas encore été visité, il ajoute son nom dans la base de données.

Pour que le code fonctionne, il faut avoir un base de données SQL nommée 'compteur' qui contient les tables suivantes :
cpt_visiteur
   ip VARCHAR(20)
   date DATE
   nbpage INT
cpt_page
   page VARCHAR(64)
   nbr INT

 

Source

  • <?php
  • $db = @mysql_connect('addr_serveur','login','password');
  • @mysql_select_db('compteur',$db);
  • // 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());
  • }
  • // 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());
  • }
  • // 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
  • ?>
<?php

$db = @mysql_connect('addr_serveur','login','password');
@mysql_select_db('compteur',$db);

// 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());
}

// 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());
}

// 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

?>

Conclusion

Je suis certain qu'il y ai des amélioration à donner à ce scipt. Donc si vous en voyez faites m'en part.

 

Commentaires et avis

signaler à un administrateur
Commentaire de coucou747 le 04/02/2006 18:47:38

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...

signaler à un administrateur
Commentaire de Arkko le 04/02/2006 18:52:24

Coucou747 > peut-être qu'un ip c'est 4 octets mais en varchar c'est 19 caracteres
xxx.xxx.xxx.xxx

signaler à un administrateur
Commentaire de Arkko le 04/02/2006 18:52:27

Coucou747 > peut-être qu'un ip c'est 4 octets mais en varchar c'est 19 caracteres
xxx.xxx.xxx.xxx

signaler à un administrateur
Commentaire de coucou747 le 04/02/2006 18:54:33

mais pourquoi tu passe ça en varchar ??? un int unsigned ça ne te convient pas ????

signaler à un administrateur
Commentaire de dark_naruto25 le 04/02/2006 22:51:24

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)).

signaler à un administrateur
Commentaire de Anthomicro le 04/02/2006 23:41:10

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)

signaler à un administrateur
Commentaire de coucou747 le 05/02/2006 14:22:02

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 !

signaler à un administrateur
Commentaire de Anthomicro le 05/02/2006 17:30:40

enlève-moi ces intval() lol vu le typage de PHP c'est inutile et plus gourmand (intval() est une fonction hyper gourmande).

signaler à un administrateur
Commentaire de coucou747 le 05/02/2006 17:51:45

ouais, à la limite... tfaçon, le principe est là...

signaler à un administrateur
Commentaire de GRenard le 07/02/2006 13:04:51

ip2long

signaler à un administrateur
Commentaire de Anthomicro le 07/02/2006 16:25:13

tiens pas mal cette fonction, en plus c'est deux fois plus rapide que l'explode + mise en INT, donc c'est nickel.

signaler à un administrateur
Commentaire de coucou747 le 07/02/2006 20:49:41

GRenard, merci pour cette fonction.

signaler à un administrateur
Commentaire de RaphAstronome le 08/02/2006 21:28:35

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.

signaler à un administrateur
Commentaire de coucou747 le 08/02/2006 21:32:25

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...

signaler à un administrateur
Commentaire de Ricou13 le 09/02/2006 10:59:30

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 ?

signaler à un administrateur
Commentaire de Anthomicro le 09/02/2006 11:31:56

# // 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];

signaler à un administrateur
Commentaire de b4ng le 04/05/2006 16:18:58

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

signaler à un administrateur
Commentaire de Ricou13 le 04/05/2006 16:36:40

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 !

signaler à un administrateur
Commentaire de Anthomicro le 04/05/2006 17:13:51

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.

signaler à un administrateur
Commentaire de RaphAstronome le 04/05/2006 20:23:10

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).

signaler à un administrateur
Commentaire de kilikiki43 le 14/09/2007 02:49:25

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.

signaler à un administrateur
Commentaire de tayeress le 28/02/2008 20:10:18

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Simuler un cookie avec une base de données [ par must ] Bonjour,puis je faire ca,pour mon compteur de visite,je voudrais normalement stocker ip du visiteur pour compteur une seule fois visite dans un cookie 2 formulaires pour une même base de données [ par pointup ] J'ai voulu, en me lançant dans le PHP,dynamiser mon nouveau site web qui est encore en construction .J'ai trouvé un script "livredor"sur le net qui m' compteur rock...config ? [ par pointup ] Bonjour les pros,J'essaie d'installer sur mon site hébergé chez free le script php du compteur de visite + connecté de rock . Vous le connaissez...il Connexion base de données [ par MadM@tt ] Bonjour à tous,Voilà auparavant dans mes scripts, je faisais une connexion à mon serveur sql à chaque requete de ma page, et je fermais la connexion a ouvrir un pdf provenant d'une base de données [ par umable ] Bonjour !Je suis en train d'essayer de créer une page qui fait appel à une base de données pour extraire :- dans la colonne de gauche une liste de nom Raffraichissement base de données [ par Angelsoul ] Salut à tous,Dans le cadre de mon stage de fin d'études, je dois récupérer les données de différents machines (presses/soudeuses). Ces données sont co Redirect PHP [ par Stephane0000 ] Bonjour,Mon projet se compose de trois pages en php. Sur la première page j'ai un formulaire dont les données sont traitées sur la seconde page (les d affichage en arabe [ par karimfar001 ] Hello salut tout le monde  je suis débutant dans la programmation php, et j'ai une application à faire qui accède a une base SQL Server 2000 pour affi creer base de données produits [ par avrilspirit ] Bonjour, je suis nouveau sur le forum. Pour mon stage, l'entreprise me demande de créer une base de données ou il faudra référencer les produits de l' tableau remplissable [ par chouchouboy ] Bonjour,Petite question : est-il possible de remplir un tableau en ligne (online) et d'enregistrer les données saisies dans une base sql. Je m'expliqu


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,33 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.