| #
# +---------------------------------------------------------------------+ #
# #
###############################################################################
# #
# v0.01 [16/07/2003] Flyounet : #
# Initiale Release #
# #
# v0.02 [21/07/2003] Flyounet : #
# Vu que je suis comme ça, je me suis demandé quelles étaient les pages #
# les plus visitées. Et vu que, Webalizer ne sait pas trop me le dire, #
# j'ai préféré modifier cette classe. Pour accélérer les requetes, il #
# est possible de désactiver ces statistiques (du moins en grande #
# partie ;). #
# J'ai aussi changé le nom des tables par défaut. Ca m'arrange. #
# J'ai ajouté des champs dth_human (non indexés), cela pour ceux qui #
# regardent les stats directements dans la table, histoire de savoir à #
# quelle heure est arrivée telle action. Ca c'est pour ceux qui sont #
# pas capables de convertir de tete un unix timestamp :D #
# En plus dans les fonction MyCpt_Add*, il y a vait une erreur qui nous #
# faisait avoir une année à 1970 :( Donc pour ceux qui utilisaient la #
# v0.01 ben vous n'avez plus qu'à vous paluchez les updates à la main:) #
# C'est plus propre à lire, non ?! #
# #
# v0.03 [23/07/2003] Flyounet : #
# .Pas de modification de la structure des tables entre la v0.02 et la #
# v0.03. Sympa non ? #
# J'avais oublié les fonctions qui retournent les résultats par script. #
# + Donc ajout des fonctions : MyCpt_GetVisite_Script (qui retourne le #
# nombre de visite pour un script donné) et MyCpt_GetPage_Script (qui #
# retourne le nombre de pages vues pour un script). Ces deux fonctions #
# peuvent soit ne retourner les valeurs que pour le script soit pour #
# l'uri. Le décompte peut se faire soit à une date précise soit sur #
# l'ensemble des données. #
# + Tient et pis voilà MyCpt_GetVisiteur_Script qui fait comme ses #
# soeurs juste au dessus. Ca retourne le nombre de visiteurs connectés #
# au script avec ou sans l'uri au choix. #
# * Correction partielle des fautes d'orthographe :p #
# * Les fonctions MyCpt_Get(Visite|Page|Image) ont été modifiées parce #
# qu'elles le valaient bien. Réduction à 2 lignes au lieu de 5 :) #
# * J'ai aussi corrigé la fonction MyCpt_Visite qui suxorisait. Pour #
# savoir si une personne était venu moins de 30 minutes auparavent, je #
# cherchait la plus ancienne connexion au lieu de la plus récente. #
# #
# v0.04 [29/07/2003] Flyounet : #
# + Ajout d'une variable indiquant le nom de la classe, uniquement #
# utilisé pour l'affichage des erreurs. Parce que là entre cettre #
# classe et celle de download, je m'y retrouve plus :( #
# + Ajout de la fonction MyCpt_MakeId qui génère un ID de $arg cara- #
# ctères. #
# + Ajout de la fonction MyCpt_AddBrowser qui comptabilise le nombre de #
# pages vues pour chaque HTTP_USER_AGENT. J'ai penser qu'il valait #
# mieux stocker l'ensemble pour ensuite faire des stats dessus, pour #
# pas perdre trop de temps lors de l'execution de script. #
# #
# v0.05 [05/08/2003] Flyounet : #
# + Ajout de la license GPL au sein du code. #
# + Ajout de la légende des symboles. #
# > Version non publiée. #
# #
# v0.06 [05/08/2003] Flyounet : #
# * Correction de la fonction MyCpt_MakeId. La chaîne générée était #
# testée dans la table T_INFO, or celle-ci ne comporte pas de champs #
# id, et de plus il ne s'agit pas forcément toujours de la même table #
# donc le premier argument est maintenant le nom de la table où faire #
# la requête pour déterminer l'id existe. #
# + Ajout de la fonction MyCpt_AddBackRef qui stocke les comptes pour #
# les liens référents. #
# * Modification de la fonction MyCpt_Visites pour la prise en compte #
# de la fonction MyCpt_AddBackRef. #
# #
# v0.07 [08/09/2003] Flyounet : Interne #
# + Ajout de la fonction MyCpt_DelLastSlash qui supprime le slash de #
# fin d'url. #
# + Ajout des horaires d'utilisation des BackRefs. #
# * Modification de la fonction MyCpt_AddBackRef pour la prise en #
# compte des horaires d'utilisations. #
# #
# v0.08 [21/01/2004] Flyounet : #
# * Modification de la fonction MyCpt_AddBackRef afin que si le user le #
# décide, il puisse stocker la relation page vue <--> BackRef/Navi. #
# Pour les sites consultés régulièrement, le volume de la base peut #
# devenir énorme. Ceci est paramétrable avec la variable T_IPBA. #
# + Ajout du navigateur dans pour le stockage T_IPBA. #
# #
# v0.09 [27/01/2004] Flyounet : #
# * Modification de la fonction MyCpt_AddBackRef afin d'ajouter l'ip #
# locale dans le champs prévu à cet effet. #
# Pour les sites consultés régulièrement, le volume de la base peut #
# > Mon provider étant très gentil, j'adore faire des tests sur ses #
# machines. Ainsi, je peux savoir laquelle de ses machines est plus #
# sollicitée. #
# #
###############################################################################
# #
# Légende : #
# + --> Indique une nouveauté, un ajout de fonctionnalité. #
# * --> Indique une correction de bogue. #
# - --> Indique la suppression d'une fonctionnalité/variable. #
# > --> Indique une information n'ayant pas forcément de rapport avec le code #
# #
###############################################################################
# Mon conseil est de modifier cette valeur et de ne pas oublier de faire un
# define dans le script appelant :)
if(!defined("wmCoinCoin")) {
print("Tu n'essayerais pas de te taper Joe l'incruste ? Dehors !");
exit();
}
class Fly_MyCpt {
/*
+---------------------------------------------------------------------------+
| |
| Les VARIALBES utilisées par la Classe |
| |
+---------------------------------------------------------------------------+
*/
# Identifiant de la classe
var $CLASSENAME = "Fly_MyCpt_v0.09";
# Variable pour la database
var $HOST = "36.15";
var $USER = "GrosNib";
var $PASSWORD = "J'aiPlusD'idée";
var $DATABASE = "NanVraimentPlus";
var $PRETABLE = "blog_";
var $LINKIDB = false;
var $LASTQUERY = "";
var $QRESULT = false;
# Liste des tables
var $T_INFO = "mycpt_info";
var $T_IP = "mycpt_ip";
var $T_STAT = "mycpt_stats";
var $T_BROW = "mycpt_browser";
var $T_BACK = "mycpt_backref";
var $T_IPBA = "mycpt_backip";
# Faire les stats sur les serveur et script
var $STAT_SERV = true;
var $STAT_URI = true;
var $STAT_BROW = true;
var $STAT_BACK = true;
var $STAT_IPBA = true;
# Nombre de secondes nécessaires entre deux visites
var $TIME_ALIVE = 1800; # 30 minutes
# Nombre de secondes pour déclarer un utilisateur Out
var $TIME_OUT = 180; # 3 minutes
# Variable pour la gestion d'erreur
var $LASTERROR = "";
var $DATEERROR = false;
var $PRINTERROR = false;
var $FILEERROR = true;
var $LOGERROR = false;
var $FULLERROR = false;
var $EXITERROR = false;
/*
+---------------------------------------------------------------------------+
| |
| Les FONCTIONS du COEUR de la Classe (Nouvelle visite, compte de visite..) |
| |
+---------------------------------------------------------------------------+
*/
# Constructeur de la classe
function Fly_MyCpt($must_connect=true) {
if($must_connect) {
$this->MyCpt_Connect();
$this->MyCpt_Visite();
}
}
# Fonction enregistre les statistiques des Référents
function MyCpt_AddBackRef() {
$now=time();
$ls_referer=$this->MyCpt_DelLastSlash(addslashes($_SERVER["HTTP_REFERER"]));
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_BACK." WHERE referer='".$ls_referer."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_BACK." SET cpt=cpt+1, dth='".$now."', dth_human='".date("Y/m/d H:i:s",$now)."' WHERE referer='".$ls_referer."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_BACK." (dth, dth_human, id, referer, cpt) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '".$this->MyCpt_MakeId($this->PRETABLE.$this->T_BACK)."', '".$ls_referer."', '1')");
# Enregistre ou non le lien entre référent et page vue.
if($this->STAT_IPBA){
if(!$addr=getenv("REMOTE_ADDR"))
$addr="";
if(!$cli=getenv("HTTP_CLIENT_IP"))
$cli="";
if(!$prox=getenv("HTTP_X_FORWARDED_FOR"))
$prox="";
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_IPBA." (dth, dth_human, ip_locale, ip_remote, ip_client, ip_proxy, server, script, request_uri, uri, referer, navigateur) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."','".$_SERVER["SERVER_ADDR"]."','".$addr."','".$cli."','".$prox."','".$_SERVER["SERVER_NAME"]."','".$_SERVER["PHP_SELF"]."','".$_SERVER["REQUEST_URI"]."','".$_SERVER["QUERY_STRING"]."', '".$ls_referer."', '".addslashes($_SERVER["HTTP_USER_AGENT"])."')");
}
}
# Fonction enregistre les statistiques par Navigateur
function MyCpt_AddBrowser() {
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_BROW." WHERE navigateur='".addslashes($_SERVER["HTTP_USER_AGENT"])."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_BROW." SET cpt=cpt+1 WHERE navigateur='".addslashes($_SERVER["HTTP_USER_AGENT"])."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_BROW." (id, navigateur, cpt) VALUES ('".$this->MyCpt_MakeId($this->PRETABLE.$this->T_BROW)."', '".addslashes($_SERVER["HTTP_USER_AGENT"])."', '1')");
}
# Fonction qui ajoute une Image
function MyCpt_AddImage() {
$now=time();
$now=mktime(0, 0, 0, date("m",$now), date("d", $now), date("Y", $now));
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_INFO." WHERE dth='".$now."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_INFO." SET img=img+1 WHERE dth='".$now."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_INFO." (dth, dth_human, visite, page, img) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '0', '0', '1')");
}
# Fonction qui ajoute une Page pour un script donné
function MyCpt_AddPage() {
$now=time();
$now=mktime(0, 0, 0, date("m",$now), date("d", $now), date("Y", $now));
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_INFO." WHERE dth='".$now."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_INFO." SET page=page+1 WHERE dth='".$now."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_INFO." (dth, dth_human, visite, page, img) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '0', '1', '0')");
# On additione une page pour le script du site
if($this->STAT_SERV) {
if($this->STAT_URI) {
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."' AND uri='".$_SERVER["QUERY_STRING"]."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_STAT." SET page=page+1 WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."' AND uri='".$_SERVER["QUERY_STRING"]."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_STAT." (dth, dth_human, visite, page, server, script, request_uri, uri) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '0', '1', '".$_SERVER["SERVER_NAME"]."', '".$_SERVER["PHP_SELF"]."', '".$_SERVER["REQUEST_URI"]."', '".$_SERVER["QUERY_STRING"]."')");
}
else {
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_STAT." SET page=page+1 WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_STAT." (dth, dth_human, visite, page, server, script) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '0', '1', '".$_SERVER["SERVER_NAME"]."', '".$_SERVER["PHP_SELF"]."')");
}
}
}
# Fonction qui ajoute une Visite
function MyCpt_AddVisite() {
$now=time();
$now=mktime(0, 0, 0, date("m",$now), date("d", $now), date("Y", $now));
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_INFO." WHERE dth='".$now."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_INFO." SET visite=visite+1 WHERE dth='".$now."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_INFO." (dth, dth_human, visite, page, img) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '1', '0', '0')");
}
# Fonction qui ajoute une Visite pour un script donné
function MyCpt_AddVisite_Script() {
$now=time();
$now=mktime(0, 0, 0, date("m",$now), date("d", $now), date("Y", $now));
if($this->STAT_URI) {
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."' AND uri='".$_SERVER["QUERY_STRING"]."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_STAT." SET visite=visite+1 WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."' AND uri='".$_SERVER["QUERY_STRING"]."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_STAT." (dth, dth_human, visite, page, server, script, request_uri, uri) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '1', '0', '".$_SERVER["SERVER_NAME"]."', '".$_SERVER["PHP_SELF"]."', '".$_SERVER["REQUEST_URI"]."', '".$_SERVER["QUERY_STRING"]."')");
}
else {
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'");
if($this->MyCpt_OneResult("n")==1)
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_STAT." SET visite=visite+1 WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'");
else
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_STAT." (dth, dth_human, visite, page, server, script) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '1', '0', '".$_SERVER["SERVER_NAME"]."', '".$_SERVER["PHP_SELF"]."')");
}
}
# Fonction qui supprime le dernier slash s'il existe.
function MyCpt_DelLastSlash($as_txt){
if(substr($as_txt, -1)=="/")
return(substr($as_txt, 0, -1));
return($as_txt);
}
# Fonction qui retourne le nombre d'images vues (par défaut toutes)
# sinon si une date est donnée pour ce jour. $date est unix_timestamp.
function MyCpt_GetImage($date=false) {
$this->MyCpt_Query("SELECT SUM(img) AS n FROM ".$this->PRETABLE.$this->T_INFO.($date?" WHERE dth='".$date."'":""));
return($this->MyCpt_OneResult("n"));
}
# Fonction qui retourne le nombre de page (par défaut toutes)
# sinon si une date est donnée pour ce jour. $date est unix_timestamp.
function MyCpt_GetPage($date=false) {
$this->MyCpt_Query("SELECT SUM(page) AS n FROM ".$this->PRETABLE.$this->T_INFO.($date?" WHERE dth='".$date."'":""));
return($this->MyCpt_OneResult("n"));
}
# Fonction qui retourne le nombre de pages vues par script (par défaut pour l'URI)
# Si une date est donnée ne calcul que pour ce jour. $date est unix_timestamp.
function MyCpt_GetPage_Script($verbose=true, $date=false) {
$ls_query="SELECT SUM(page) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'";
if($verbose)
$ls_query.=" AND uri='".$_SERVER["QUERY_STRING"]."'";
if($date)
$ls_query.=" AND dth='".$date."'";
$this->MyCpt_Query($ls_query);
return($this->MyCpt_OneResult("n"));
}
# Fonction qui retourne le nombre de visite (par défaut toutes)
# sinon si une date est donnée pour ce jour. $date est unix_timestamp.
function MyCpt_GetVisite($date=false) {
$this->MyCpt_Query("SELECT SUM(visite) AS n FROM ".$this->PRETABLE.$this->T_INFO.($date?" WHERE dth='".$date."'":""));
return($this->MyCpt_OneResult("n"));
}
# Fonction qui retourne le nombre de visite par script (par défaut pour l'URI)
# Si une date est donnée ne calcul que pour ce jour. $date est unix_timestamp.
function MyCpt_GetVisite_Script($verbose=true, $date=false) {
$ls_query="SELECT SUM(visite) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'";
if($verbose)
$ls_query.=" AND uri='".$_SERVER["QUERY_STRING"]."'";
if($date)
$ls_query.=" AND dth='".$date."'";
$this->MyCpt_Query($ls_query);
return($this->MyCpt_OneResult("n"));
}
# Fonction qui retourne le nombre de visiteurs sur le site
function MyCpt_GetVisiteur() {
$this->MyCpt_Query("SELECT ip_remote, ip_client, ip_proxy FROM ".$this->PRETABLE.$this->T_IP." WHERE dth>='".(int)(time()-$this->TIME_OUT)."' GROUP BY ip_remote, ip_client, ip_proxy");
return($this->MyCpt_QCount());
}
# Fonction qui retourne le nombre de visiteurs sur le site
function MyCpt_GetVisiteur_Script($verbose=true) {
$this->MyCpt_Query("SELECT ip_remote, ip_client, ip_proxy FROM ".$this->PRETABLE.$this->T_IP." WHERE dth>='".(int)(time()-$this->TIME_OUT)."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."' ".($verbose?" AND uri='".$_SERVER["QUERY_STRING"]."' ":"")." GROUP BY ip_remote, ip_client, ip_proxy");
return($this->MyCpt_QCount());
}
# Fonction qui ajoute un visiteur et supprime les plus vieux
function MyCpt_Visite() {
if(!$addr=getenv("REMOTE_ADDR"))
$addr="";
if(!$cli=getenv("HTTP_CLIENT_IP"))
$cli="";
if(!$prox=getenv("HTTP_X_FORWARDED_FOR"))
$prox="";
# On récupère la plus récente connexion pour cette IP
$this->MyCpt_Query("SELECT MAX(dth) AS n FROM ".$this->PRETABLE.$this->T_IP." WHERE ip_remote='".$addr."' AND ip_client='".$cli."' AND ip_proxy='".$prox."'");
# $t=$this->MyCpt_OneResult("n");print $t." ".date("Y/d/m H:i:s",$t)." - ".time()."[".($t+$this->TIME_ALIVE)."] ".date("Y/d/m H:i:s",time());
# Si plus vieille que le TIME_ALIVE seconndes, On ajoute une visite.
if(($this->MyCpt_OneResult("n")+$this->TIME_ALIVE)