<?php

# ########################################################################### #
# fly_mycpt.inc.php : Il s'agit d'une classe pour compter le nombre d'utili-  #
#                     sateurs "sur le site", le nombre de page vue, le nombre #
#                     de visiteurs venus sur le site.                         #
# ########################################################################### #
# 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 capable de convertir de tete un unix timestamp :D                 #
#       En plus dans les fonctions MyCpt_Add*, il y avait 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 ?!                                      #
#                                                                             #
# ########################################################################### #

# 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 ? <a href=\"http://www.tusors.fr.st\">Dehors !</a>");
  exit();
}

class 
Fly_MyCpt {
  
/*
  +---------------------------------------------------------------------------+
  |                                                                           |
  |                   Les VARIALBES utilisées par la Classe                   |
  |                                                                           |
  +---------------------------------------------------------------------------+
  */
  # Variable pour la database
  
var $HOST      "sql*";
  var 
$USER      "abouare";
  var 
$PASSWORD  "sivousplééééé";
  var 
$DATABASE  "fétrochauddddddd";
  var 
$PRETABLE  "blog_";
  
# private :
  
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";

  
# Faire les stats sur les serveur et script
  
var $STAT_SERV true;
  var 
$STAT_URI 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 true;
  var 
$FILEERROR  true;
  var 
$LOGERROR   false;
  var 
$FULLERROR  false;
  var 
$EXITERROR  true;
  
  
/*
  +---------------------------------------------------------------------------+
  |                                                                           |
  | 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 qui ajoute une Image
  
function MyCpt_AddImage() {
    
$now=time();
    
$now=mktime(000date("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
  
function MyCpt_AddPage() {
    
$now=time();
    
$now=mktime(000date("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')");
  }

  
# Fonction qui ajoute une Visite
  
function MyCpt_AddVisite() {
    
$now=time();
    
$now=mktime(000date("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')");
    if(
$this->STAT_SERV) {
      
$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_STAT." WHERE dth='".$now."'");
      if(
$this->MyCpt_OneResult("n")==1)
        
$ls_q="UPDATE ".$this->PRETABLE.$this->T_STAT." SET visite=visite+1 WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."'";
      else
        
$ls_q="INSERT INTO ".$this->PRETABLE.$this->T_STAT." (dth, dth_human, visite, page, img) VALUES ('".$now."','".date("Y/m/d H:i:s",$now)."', '0', '1', '0')");


    
        if(
$this->STAT_URI)
          
$this->MyCpt_Query("UPDATE ".$this->PRETABLE.$this->T_INFO." SET visite=visite+1 WHERE dth='".$now."' AND server='".$_SERVER["SERVER_NAME"]."' AND script='".$_SERVER["PHP_SELF"]."' AND uri='".$_SERVER["QUERY_STRING"]."'");

    }
  }

  
# 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) {
    if(!
$date)
      
$this->MyCpt_Query("SELECT SUM(img) AS n FROM ".$this->PRETABLE.$this->T_INFO);
    else
      
$this->MyCpt_Query("SELECT img AS n FROM ".$this->PRETABLE.$this->T_INFO." 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) {
    if(!
$date)
      
$this->MyCpt_Query("SELECT SUM(page) AS n FROM ".$this->PRETABLE.$this->T_INFO);
    else
      
$this->MyCpt_Query("SELECT page AS n FROM ".$this->PRETABLE.$this->T_INFO." WHERE dth='".$date."'");
    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) {
    if(!
$date)
      
$this->MyCpt_Query("SELECT SUM(visite) AS n FROM ".$this->PRETABLE.$this->T_INFO);
    else
      
$this->MyCpt_Query("SELECT visite AS n FROM ".$this->PRETABLE.$this->T_INFO." WHERE dth='".$date."'");
    return(
$this->MyCpt_OneResult("n"));
  }

  
# Fonction qui retourne le nombre de visiteurs sur le site
  
function MyCpt_GetVisiteur() {
    
#$this->MyCpt_Query("SELECT COUNT(*) AS n FROM ".$this->PRETABLE.$this->T_IP." WHERE dth>='".(int)(time()-$this->TIME_OUT)."' GROUP BY ip_remote, ip_client, ip_proxy");
    
$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 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 MIN(dth) AS n FROM ".$this->PRETABLE.$this->T_IP." WHERE ip_remote='".$addr."' AND ip_client='".$cli."' AND ip_proxy='".$prox."'");
    
# Si plus vieille que le TIME_ALIVE seconndes, On ajoute une visite.
    
if(($this->MyCpt_OneResult("n")+$this->TIME_ALIVE)<time())
      
$this->MyCpt_AddVisite();
    
$this->MyCpt_Query("INSERT INTO ".$this->PRETABLE.$this->T_IP." (dth, dth_human, ip_remote, ip_client, ip_proxy, server, script, request_uri, uri) VALUES ('".time()."','".date("Y/m/d H:i:s",time())."','".$addr."','".$cli."','".$prox."','".$_SERVER["SERVER_NAME"]."','".$_SERVER["PHP_SELF"]."','".$_SERVER["REQUEST_URI"]."','".$_SERVER["QUERY_STRING"]."')");
    
$this->MyCpt_Query("DELETE FROM ".$this->PRETABLE.$this->T_IP." WHERE dth<'".(int)(time()-$this->TIME_ALIVE)."'");
  }

  
/*
  +---------------------------------------------------------------------------+
  |                                                                           |
  | Les FONCTIONS DIVERSES (Connexion Database, Message d'Erreur, etc)        |
  |                                                                           |
  +---------------------------------------------------------------------------+
  */
  
  # Fonction de connexion à la database
  
function MyCpt_Connect() {
    
$this->LINKIDB=@mysql_connect($this->HOST$this->USER$this->PASSWORD);
    if(!
$this->LINKIDB)
      
$this->MyCpt_Error("La connexion à la base a échoué. {".mysql_errno()."}{".mysql_error()."}");
    if(!@
mysql_select_db($this->DATABASE))
      
$this->MyCpt_Error("La sélection de la base a échoué. {".mysql_errno()."}{".mysql_error()."}");
  }

  
# Fonction de modification des paramètres de la base de données
  # $db est en premier car c'est souvent (dans mon cas) la DB que je change
  #function MyCpt_DbParam($db=$this->DATABASE, $host=$this->HOST, $user=$this->USER, $password=$this->PASSWORD) {
  
function MyCpt_DbParam($db$host$user$password) {
    
$this->HOST     $host;
    
$this->USER     $user;
    
$this->PASSWORD $password;
    
$this->DATABASE $db;
  }

  
# Fonction de gestion des erreurs
  
function MyCpt_Error($msg) {
    
$this->LASTERROR $msg;
    
$this->DATEERROR time();
    
$ls_msg "[".$_SERVER["SERVER_NAME"]."][".date("d/m/Y H:i:s",$this->DATEERROR)."][".$_SERVER["PHP_SELF"]."][";
    if(
$this->FULLERROR)
      
$ls_msg.=$this->USER.":********@".$this->HOST."/".$this->DATABASE;
    else
      
$ls_msg.=$this->DATABASE;
    
$ls_msg.="][".$msg."]\n";
    if(
$this->PRINTERROR)
      print (
"<!-- \n".$ls_msg."--><font color=\"#ff0000\"><strong>".$ls_msg."</strong></font><br/>");
    if(
$this->LOGERROR)
      @
error_log($ls_msg0);
    if(
$this->FILEERROR)
      if(
$this->FULLERROR)
        
error_log($ls_msg3"./Fly_MyCpt_".$this->DATABASE.".log");
      else
        @
error_log($ls_msg3"./Fly_MyCpt_".$this->DATABASE.".log");
    if(
$this->EXITERROR)
      exit();
  }

  
# Fonction qui retourne un résultat de requete, mais uniquement 1 dont
  # le nom est passé en argument.
  
function MyCpt_OneResult($qui) {
    if(
$res=@mysql_fetch_array($this->QRESULT))
      return(
$res[$qui]);
    return(
0);
  }

  
# Fonction de décompte du résultat de la requete
  
function MyCpt_QCount() {
    if(
eregi("^SELECT(.*)$"trim($this->LASTQUERY)))
      return(@
mysql_num_rows($this->QRESULT));
    if(
eregi("^(INSERT|DELETE|UPDATE)(.*)$"trim($this->LASTQUERY)))
      return(@
mysql_affected_rows($this->QRESULT));
    
$this->MyCpt_Error("On ne peut obtenir de décompte pour la requete suivante {".$this->LASTQUERY."}. {".mysql_errno()."}{".mysql_error()."}");
  }

  
# Fonction d'éxecution des requetes
  
function MyCpt_Query($query) {
    
$this->LASTQUERY $query;
    
$this->QRESULT=@mysql_query($query$this->LINKIDB);
    if(!
$this->QRESULT)
      
$this->MyCpt_Error("La requete suivante n'a pas été executée {".$query."}. {".mysql_errno()."}{".mysql_error()."}");
  }

  
  
# end of Class Fly_MyCpt

?>