"; print_r($_GET); echo ""; }
// tests sur nombres
testnum($_GET['site']);
testnum($_GET['h']);
testnum($_GET['m']);
testnum($_GET['s']);
testnum($_GET['c']);
// inclusion des fichiers de config
$site = $_GET['site'];
require "./config$site.php";
require "./langdispos.php";
require "./include/connect.php";
require "./include/os.php";
require "./langs/$default_lang";
// on prend l'url du site
include "./nomsites.php";
$explode_urls = explode('||',${'site'.$site});
$url_site = urldecode($explode_urls[2]);
printdebug("url du site audité : $url_site
");
//-----------------//
// AFFICHAGE IMAGE //
//-----------------//
if(!DEBUG)
{
// si l'affichage du logo est activé
if(!isset($logo) || $logo==1)
{
$image = "./images/logo.png";
}
// sinon on affiche le pixel
else
{
$image = "./images/pixel.png";
}
header("Content-type: image/png");
readfile($image);
}
@flush();
// suivant la configuration on inclue pas l'admin (option de configuration)
$nomcookie = "statspmv".$site;
if (isset($_GET['site']) && isset($_COOKIE[$nomcookie]))
{
$cookiestats = $_COOKIE[$nomcookie];
}
else
{
$cookiestats = "true";
}
if(DEBUG)
{
print_r($_COOKIE);
print "L'admin ";
if ($cookiestats == "false") print "n'est pas";
else print "est";
print " pris en compte pour le site ".$_GET['site']."
";
}
// on arrete si désactivé
if ($cookiestats == "false")
{
exit();
}
// temps compté pour les visites à une page en s (moins de 30 pour graphs durée visites)
$tps_une_page = '20';
// temps apres lequel une visites est comptée comme nouvelle visite, en s
$temps_limite = 30*60; // temps normé à ne pas éditer
//--------------------------//
// DEFINITIONS DE FONCTIONS //
//--------------------------//
// fonction d'affichage de texte utile au débugage
function printdebug($texte)
{
if(DEBUG)
{
print($texte."
\n");
}
}
function lang_navig($langue,$domaines)
{
if(isset($langue))
{
// on utilise la langue du navigateur
$lan = substr($langue,0,2);
// si langue de la forme en-ca, en-gb... prendre les caractères 4-5
if($lan == 'en')
{
$lan = substr($langue,3,2);
}
// on retourne langue du navig
return $lan;
}
else
{
// le pays est inconnu
return 'xx';
}
}
function get_pays($host,$langue,$domaines)
{
// si il y a un host et qu'il n'est pas vide
if(isset($host) && !empty($host))
{
// on le met ainsi que la langue du navig en miniscules
$host = strtolower($host);
$langue = strtolower($langue);
// on prend l'extension (domain name) du host du visiteur
ereg("\.([^.]+)$", $host, $cd);
// et on regarde le pays dans le tableau domaines si il existe
// si oui alors on le retourne
// si non et langue du navig définie alors on la traite avec lang_navig
// si non 'xx'
// si le domain name du host est définie comme un pays
if(isset($domaines["{$cd[1]}"]))
{
// p = nom du pays
$p = $domaines["{$cd[1]}"];
// si .com .net .org ou autres
if($p == '-')
{
// traitement de la langue du navigateur
return lang_navig($langue,$domaines);
}
// sinon on retourne le domain name car il correspond a un pays
return $cd[1];
}
// si le domain name ne correspond pas à un pays référencé
else
{
return lang_navig($langue,$domaines);
}
}
// si il n'y a pas de host
else
{
return lang_navig($langue,$domaines);
}
}
function get_navig($agent)
{
printdebug($agent);
require_once("./include/navigateur.class.php");
$navigateur_courant = new retrouver_navigateur();
$navigateur_courant->initialisation();
return strtoupper($navigateur_courant->_navigateur_info[strtolower('navigateur')]).";".$navigateur_courant->_navigateur_info[strtolower('version')];
}
// fonction inspirée d'une fonction du script "Les Visiteurs" de J-Pierre Dézélus (jpdezelus_at_phpinfo_dot_net)
function get_os($agent,$lnav)
{
for (@reset($lnav), $ok = false; (list($key, $value) = @each($lnav)) && !$ok;)
{
if ($ok = ereg($key, $agent))
{
return $value;
break;
}
}
return 'INC';
}
// on insère le suivi lors d'une visite déjà reconnu
// sinon on insère pas car page1=page d'un autre site
function suivi($ref,$url)
{
global $table_suivi;
// si le referrer est bien défini et non vide
if(isset($ref) && !empty($ref))
{
// si l'ensemble page1 => page2 a déjà été fait, alors on incrémente nb
$req8 = mysql_query("UPDATE $table_suivi SET nb=nb+1 WHERE page1='$ref' AND page2='$url' AND date=CURRENT_DATE LIMIT 1");
// sinon on insère son nom dans la bdd
if(mysql_affected_rows()==0)
{
printdebug("
On insère le nouveau suivi $ref => $url dans la table");
$req9 = mysql_query("INSERT INTO $table_suivi (nb, page1, page2, date) VALUES (1, '$ref', '$url', CURRENT_DATE)");
}
else
{
printdebug("
Le suivi $ref => $url est connu");
}
}
else
{
printdebug("
Pas de referrer");
}
}
// on prend l'ip de la meilleure manière qu'il soit
function get_ip()
{
if (getenv("HTTP_CLIENT_IP"))
{
$ip = getenv("HTTP_CLIENT_IP");
}
elseif(getenv("HTTP_X_FORWARDED_FOR"))
{
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
else
{
$ip = getenv("REMOTE_ADDR");
}
return $ip;
}
// traitement de l'url en fonction des paramètres de configX.php
function params_get($url_paramsget)
{
global $conditionsget;
if(DEBUG)
{
printdebug("url avant traitement pour les paramètres GET : $url_paramsget");
}
// ? -> ±
for($i=0;$i");
return $url_paramsget;
}
// transforme url index en / pour les stats
function index_slash($url)
{
if( $url==urldecode("/") ||
$url==urldecode("/index") ||
$url==urldecode("/index.html") ||
$url==urldecode("/index.htm") ||
$url==urldecode("/index.php") ||
$url==urldecode("/index.php3"))
{
printdebug("
URL DECODE
");
$url='/';
}
return $url;
}
// si changements faire de même dans functions.php
// supprime les espaces dans les chaines (vs sql_injection)
function del_spaces($string)
{
$string = str_replace(' ','',$string);
return $string;
}
// si changements faire de même dans functions.php
// test numeric
function testnum($string)
{
if(!is_numeric($string)){ exit(); }
}
//--------------------------//
// DEFINITIONS DE VARIABLES //
//--------------------------//
// on met l'url en minuscule
$url=del_spaces(strtolower($_GET['url']));
// on met le host de l'url active en minuscule
$siteh=del_spaces(strtolower($_GET['siteh']));
// on prend le referrer en minuscules
$ref=del_spaces(str_replace('%25','+',str_replace('%5C','+',str_replace('%60','+',str_replace('%22','+',str_replace('%27','+',str_replace('%20','+',str_replace(' ','+',strtolower($_GET['ref'])))))))));
// on enleve les params si il y a lieu
// et on met / si il y a lieu pour l'url
if(DEBUG){ print("URL DE LA PAGE VUE
"); }
$url = params_get($url);
$url = index_slash($url);
// on slash aussi le ref pour le suivi
if(DEBUG){ print("URL REFERRER
"); }
$ref = params_get($ref);
$ref = index_slash($ref);
// on définit l'ip
$ip = get_ip();
// d'où découle le host
$host = del_spaces(@getHostByAddr($ip));
// la résolution
$res=del_spaces($_GET['res']);
// le nombre de couleurs
$c=del_spaces($_GET['c']);
// la date du jour
$date = date("Y-m-d");
// la langue du navigateur
$langue = del_spaces($_SERVER['HTTP_ACCEPT_LANGUAGE']);
// l'agent du browser
$agent = $_SERVER['HTTP_USER_AGENT'];
// local time
$time = del_spaces($_GET['h'].":".$_GET['m'].":".$_GET['s']);
$time_sec = mktime($_GET['h'],$_GET['m'],$_GET['s']);
// et server time
$stime = date("H:i:s");
$stime_sec = time();
printdebug("Heure locale : $time ($time_sec) | Heure serveur : $stime ($stime_sec)
");
//------------------//
// VISITEUR CONNU ? //
//------------------//
// on regarde si le visiteur est connu (test du temps où il est arrivé)
$req1 = mysql_query("SELECT TIME_TO_SEC(stime),id FROM $table WHERE date=CURRENT_DATE AND ip='$ip' ORDER BY stime DESC LIMIT 1");
$req1b = mysql_fetch_row($req1);
$id_vis = $req1b[1];
//-----------------------------//
// VISITEUR CONNU //
// PAGE REF APPARTIENT AU SITE //
//-----------------------------//
if(!isset($req1b[0]) && (substr(urldecode($ref),0,strlen($url_site))==$url_site || substr_count(urldecode($ref), $siteh)>0))
{
printdebug("
la page ref appartient au site auditée => le visiteur est connu");
$visiteur_connu=true;
// on essaye de sélectionner un ancien visiteur pour lequel l'écart entre hs et hl est égal à +/- 1s près et où os, resol, coul sont les mêmes
// heure à +/- 1 heure pres, le même jour | sauf si minuit auquel cas on regarde à minuit
if(date("H")!=0){ $heure_minus1=date("H")-1; } else { $heure_minus1=0; }
// SUPPRIMER SELECTIONS [2] et [3]
$req10_txt = "SELECT id,ttime,(TIME_TO_SEC(stime)-TIME_TO_SEC(time)) AS diff1,($stime_sec-$time_sec) AS diff2 FROM $table WHERE date=CURRENT_DATE AND HOUR(stime)>=".$heure_minus1." AND ($stime_sec-$time_sec)<=((TIME_TO_SEC(stime)-TIME_TO_SEC(time))+2) AND ($stime_sec-$time_sec)>=((TIME_TO_SEC(stime)-TIME_TO_SEC(time))-2) AND os='".get_os($agent,$lnav)."' AND resol='$res' AND coul='$c' LIMIT 1";
$req10 = mysql_query($req10_txt);
// si un visiteur correspond aux tests
if(mysql_affected_rows()!=0)
{
// on prend les données requete, id et ttime
$req10b = mysql_fetch_row($req10);
$id_vis = $req10b[0];
$ttime = $req10b[1];
if($req10){ printdebug("temps sel 1: ".$req10b[2]."| temps sel 2 : ".$req10b[3]."
"); printdebug("Requete succès
"); }
else{ printdebug("probleme req : ".mysql_error()."
$req10_txt");}
$methode="visiteur correspondant aux tests horloge";
}
// si pas de visiteur correspondant, on ajoute les stats au premier visiteur de l'heure concernée
else
{
$req9 = mysql_fetch_row(mysql_query("SELECT id,ttime FROM $table WHERE date=CURRENT_DATE AND hour(stime)=".date("H")." ORDER BY id ASC LIMIT 1"));
// si pas de réponse (pas de visiteur à cette heure) alors on considère comme nouveau visiteur
if(empty($req9)){ $h=date("H"); printdebug("pas de visiteur connu à cette heure (heure $h) ; on considère comme nouveau visiteur"); unset($visiteur_connu); }
$id_vis = $req9[0];
$ttime = $req9[1];
$methode="premier visiteur de l'heure correspondante";
}
printdebug("Nouvelle ID = > $id_vis | ttime : $ttime [ méthode $methode ]
");
}
//-------------------------//
// VISITEUR CONNU //
// MISE A JOUR DES DONNEES //
//-------------------------//
if(isset($req1b[0]) || isset($visiteur_connu))
{
printdebug("Visiteur connu");
$sec_today = date("H")*3600+date("i")*60+date("s");
// si le temps resté lors de la précédente visite n'a pas été calculé
// alors on le calcule avec la requete $req1
if(!isset($visiteur_connu))
{
// heure serveur 1ere visite en secondes
$time_reste = $req1b[0];
}
else
{
printdebug("
on calcule le temps...
sec_today = $sec_today | ttime = $ttime
");
// le ttime est le temps qu'est resté le visiteur auquel on rajoute les stats de cette visite
// on met 10 s pour cette page vue
$time_reste = $sec_today-($ttime+10);
}
// on fait la différence entre sec_today (sec de CURRENT_DATE et time_reste convertion en s de l'heure d'arrivée)
$diff = $sec_today - $time_reste;
printdebug("temps resté : $diff s");
// si le visiteur est le même, que sa visite dure depuis moins longtemps que le temps limite
if($diff < $temps_limite)
{
// update de son nombre de pages vues + temps qu'il est resté dans la première table // pas de ORDER BY id ASC avant mysql 4.0
$req2 = mysql_query("UPDATE $table SET nb_pv=nb_pv+1, ttime = '$diff', pv_fin = '$url' WHERE date=CURRENT_DATE AND id='".$id_vis."' LIMIT 1");
if(DEBUG) { if($req2){ print("
Requete OK "); }else { print("
Probleme requete"); print(mysql_error()); } }
// si la page visitée a déjà été vue aujourd'hui, alors on update le champ 'nb' sinon on insère son nom dans la bdd
$req3=mysql_query("UPDATE $table_pv SET nb=nb+1 WHERE page='$url' AND date=CURRENT_DATE LIMIT 1");
if(mysql_affected_rows()==0)
{
$req4=mysql_query("INSERT INTO $table_pv (page, nb, date) VALUES ('$url', 1, CURRENT_DATE)");
printdebug("
Requete d'insertion pour '$url' dans '$table_pv' : ok");
}
// si il y a un referrer, alors on enregistre le suivi
// sinon pas d'intérêt car info déjà présente dans la table $phpmv
suivi($ref,$url);
printdebug("
Ref : $ref
URL active : $url
");
}
// si le visiteur est considéré comme une deuxième visite
else
{
printdebug("Temps supérieur à $temps_limite s > ");
$newv=true;
}
}
//------------------//
// NOUVEAU VISITEUR //
//------------------//
// Si la première requete est vide ou si le visiteur est considéré comme nouveau
// (surf depuis plus de $temps_limite sur site ou revient apres $temps_limite secondes)
if((!isset($req1b[0]) && !isset($visiteur_connu)) || isset($newv))
{
// pays du visiteur
$pays=get_pays($host,$langue,$domaines);
// navigateur & version
$navig=get_navig($agent);
// systèmes d'exploitation
$os=get_os($agent,$lnav);
if(DEBUG)
{
print("Nouvelle visite");
print("pays : $pays");
print("navig = $navig");
print("os = $os");
}
if(isset($newv)) { $newv=0; } else { $newv=1; }
$req5=mysql_query("INSERT INTO $table (nv,date,time,stime,ttime,referrer,pv_debut,pv_fin,nb_pv,host,ip,os,navig,resol,coul,pays,lang_navig,agent) values ('$newv', '$date', '$time', '$stime', '$tps_une_page', '$ref', '$url', '$url', 1, '$host', '$ip', '$os', '$navig', '$res', '$c', '$pays', '$langue', 'none')");
if(!$req5 && DEBUG)
{
print("Problème requête d'insertion finale ".mysql_error());
}
// si la page visitée a déjà été vue aujourd'hui alors on update le champ 'nb'
$req6 = mysql_query("UPDATE $table_pv SET nb=nb+1 WHERE page='$url' AND date=CURRENT_DATE LIMIT 1");
// sinon on insère son nom dans la bdd
if(mysql_affected_rows()==0)
{
printdebug("On insère la nouvelle page dans la base");
$req7 = mysql_query("INSERT INTO $table_pv (page, nb, date) VALUES ('$url', 1, CURRENT_DATE)");
}
}
mysql_free_result($req1);
// on ferme la connexion
mysql_close($connexion);
if(DEBUG)
{
$result = get_microtime()-$time_start;
print("
La génération de la page a durée ".substr($result,0,4)." secondes");
}
?>