begin process at 2010 03 12 22:17:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > COMPTEUR PAR VISITES ET PAR PAGES

COMPTEUR PAR VISITES ET PAR PAGES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :8 648

Auteur : dark_naruto25

Ecrire un message privé
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.


 Sources du même auteur

GRAPHIQUE EN DYNAMIQUE

 Sources de la même categorie

RECUP IDENTIFICATION par luludovicp
Source avec Zip EXTEND MYSQLI par petibras
Source avec Zip CLASSE DE COMMANDES PEAR DB par pascalmintrosse
Source avec Zip AFFICHER LE RÉSULTAT D'UNE REQUÊTE SQL SUR PLUSIEURS PAGE par karimmass
Source avec Zip SQLDIFF : MIGRATION, VERSIONNING ET SYNCHRONISATION DE LA ST... par aKheNathOn

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture COMPTEUR DE VISITES AVEC IMAGE PNG par lucas74
Source avec Zip QUIZ EN INFORMATIQUE AVEC BASE DES DONNEES TESTEZ VOS CONNAI... par abidou009
Source avec Zip [POO] CLASSE D'ABSTRACTION SQL par neigedhiver
Source avec Zip COMPTEURS SIMPLE/IP/COOKIES par edotheking
Source avec Zip CLASSE DE MANIPULATION DE SGBD + LOGS par depression

Commentaires et avis

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

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

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

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

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

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)

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 !

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

Commentaire de coucou747 le 05/02/2006 17:51:45

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

Commentaire de GRenard le 07/02/2006 13:04:51

ip2long

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.

Commentaire de coucou747 le 07/02/2006 20:49:41

GRenard, merci pour cette fonction.

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.

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

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 ?

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

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

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 !

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.

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

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.

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 formulaire et base de données [ par blackitou ] je suis debutant en dreamweaver mais avec un peut de courage j'ai crerer un site web avec des animation flash ,horloge,... mais je veut ajouter une es formulaire [ par blackitou ] je suis debutant en dreamweaver mais avec un peut de courage j'ai crerer un site web avec des animation flash ,horloge,... mais je veut ajouter une es compteur du nombre de visite sur chaque page (enregistrees dans BDD) [ par ju0123456789 ] Bonjour, J'ai un site php, il y a un traceur sur chacune de mes pages, qui sont enregistrées dans ma BDD à la seconde près; avec le nom de la page as


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales