"; 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"); } ?>