New file |
0,0 → 1,357 |
<?php |
|
/***************************************************************************\ |
* SPIP, Systeme de publication pour l'internet * |
* * |
* Copyright (c) 2001-2005 * |
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * |
* * |
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. * |
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * |
\***************************************************************************/ |
|
|
// Ce fichier ne sera execute qu'une fois |
if (defined("_ECRIRE_INC_STATISTIQUES")) return; |
define("_ECRIRE_INC_STATISTIQUES", "1"); |
|
// |
// Compiler les statistiques temporaires : visites |
// |
|
// Les deux fonctions suivantes sont adaptees du code des "Visiteurs", |
// par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/) |
|
function stats_load_engines() { |
// le moteur de recherche interne |
$arr_engines = Array(); |
|
$file_name = 'engines-list.txt'; |
if ($fp = @fopen($file_name, 'r')) |
{ |
while ($data = fgets($fp, 256)) |
{ |
$data = trim(chop($data)); |
|
if (!ereg('^#', $data) && $data != '') |
{ |
if (ereg('^\[(.*)\]$', $data, $engines)) |
{ |
// engine |
$engine = $engines[1]; |
|
// query | dir |
if (!feof($fp)) |
{ |
$data = fgets($fp, 256); |
$query_or_dir = trim(chop($data)); |
} |
} |
else |
{ |
$host = $data; |
$arr_engines[] = Array($engine, $query_or_dir, $host); |
} |
} |
} |
fclose($fp); |
} |
return $arr_engines; |
} |
|
function stats_show_keywords($kw_referer, $kw_referer_host) { |
static $arr_engines; |
static $url_site; |
include_ecrire("inc_filtres.php3"); |
|
if (!$arr_engines) { |
// Charger les moteurs de recherche |
$arr_engines = stats_load_engines(); |
|
// initialiser la recherche interne |
$url_site = lire_meta('adresse_site'); |
$url_site = strtolower(eregi_replace("^((https?|ftp)://)?(www\.)?", "", $url_site)); |
} |
|
$url = @parse_url( $kw_referer ); |
$query = $url['query']; |
$host = strtolower($url['host']); |
$path = $url['path']; |
|
// Cette fonction affecte directement les variables selon la query-string ! |
parse_str($query); |
|
$keywords = ''; |
$found = false; |
|
if (strpos('-'.$kw_referer, eregi_replace("^(https?:?/?/?)?(www\.)?", "",$url_site))) { |
if (eregi("(s|search|r|recherche)=([^&]+)", $kw_referer, $regs)) |
$keywords = urldecode($regs[2]); |
|
|
else |
return ''; |
} else |
for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++) |
{ |
if ($found = (ereg($arr_engines[$cnt][2], $host))) |
{ |
$kw_referer_host = $arr_engines[$cnt][0]; |
|
if (ereg('=', $arr_engines[$cnt][1])) { |
|
// Fonctionnement simple: la variable existe |
$keywords = ${str_replace('=', '', $arr_engines[$cnt][1])}; |
|
// Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable |
if (! strlen($keywords) > 0) { |
if (ereg($arr_engines[$cnt][1]."([^\&]*)", $query, $vals)) { |
$keywords = urldecode($vals[2]); |
} |
} |
} else { |
$keywords = ""; |
} |
|
if (( ($kw_referer_host == "Google") |
|| ($kw_referer_host == "AOL" && !ereg('enc=iso', $query)) |
|| ($kw_referer_host == "MSN") |
)) { |
include_ecrire('inc_charsets.php3'); |
if (!$cset = $ie) $cset = 'utf-8'; |
$keywords = importer_charset($keywords,$cset); |
} |
$buffer["hostname"] = $kw_referer_host; |
} |
} |
|
$buffer["host"] = $host; |
if (!$buffer["hostname"]) |
$buffer["hostname"] = $host; |
|
$buffer["path"] = substr($path, 1, strlen($path)); |
$buffer["query"] = $query; |
|
if ($keywords != '') |
{ |
if (strlen($keywords) > 150) { |
$keywords = spip_substr($keywords, 0, 148); |
// supprimer l'eventuelle entite finale mal coupee |
$keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords); |
} |
$buffer["keywords"] = trim(entites_html(stripslashes($keywords))); |
} |
|
return $buffer; |
|
} |
|
|
// |
// Optimiser les informations liees aux referers |
// |
|
function supprimer_referers($type = "") { |
$table = 'spip_referers'; |
if ($type) { |
$table .= '_'. $type . 's'; |
$col_id = 'id_' . $type; |
$query = "SELECT COUNT(DISTINCT $col_id) AS count FROM $table"; |
$result = spip_query($query); |
if ($row = @spip_fetch_array($result)) { |
$count = $row['count']; |
} |
} |
if (!$count) $count = 1; |
|
$query = "SELECT visites FROM $table ". |
"ORDER BY visites LIMIT ".intval($count * 100).",1"; |
$result = spip_query($query); |
$visites_min = 1; |
if ($row = @spip_fetch_array($result)) { |
$visites_min = $row['visites']; |
} |
|
$query = "DELETE FROM $table WHERE (date < DATE_SUB(NOW(),INTERVAL 7 DAY) AND visites <= $visites_min) OR (date < DATE_SUB(NOW(),INTERVAL 30 DAY))"; |
$result = spip_query($query); |
} |
|
|
|
// |
// Compiler les statistiques temporaires : referers (si active) |
// |
|
function calculer_n_referers($nb_referers) { |
$date = date("Y-m-d"); |
|
$result = spip_query("SELECT COUNT(DISTINCT ip) AS visites, referer, HEX(referer_md5) AS md5 ". |
"FROM spip_referers_temp GROUP BY referer_md5 LIMIT 0,$nb_referers"); |
|
$tous = spip_num_rows($result); |
|
$referer_insert = ""; |
$referer_update = ""; |
$referer_vus = ""; |
|
while ($row = @spip_fetch_array($result)) { |
$visites = $row['visites']; |
$referer = addslashes($row['referer']); |
$referer_md5 = '0x'.$row['md5']; |
$referer_update[$visites][] = $referer_md5; |
$referer_insert[] = "('$date', '$referer', $referer_md5, $visites, $visites)"; |
$referer_vus .= "," . $referer_md5; |
} |
if ($referer_vus) |
$referer_vus = "referer_md5 IN (" . substr($referer_vus,1) . ")"; |
|
// Mise a jour de la base |
if (is_array($referer_update)) { |
while (list($visites, $referers) = each($referer_update)) { |
$query = "UPDATE spip_referers SET visites = visites + $visites, visites_jour = visites_jour + $visites ". |
"WHERE referer_md5 IN (".join(', ', $referers).")"; |
$result = spip_query($query); |
} |
} |
if (is_array($referer_insert)) { |
$query_insert = "INSERT IGNORE INTO spip_referers ". |
"(date, referer, referer_md5, visites, visites_jour) VALUES ".join(', ', $referer_insert); |
$result_insert = spip_query($query_insert); |
} |
|
// Ventiler ces referers article par article |
$query = "SELECT COUNT(DISTINCT ip) AS visites, id_objet, referer, HEX(referer_md5) AS md5 FROM spip_referers_temp WHERE type='article'" |
. ($referer_vus ? " AND $referer_vus" : '') |
. " GROUP BY id_objet, referer_md5"; |
$result = spip_query($query); |
|
$referer_insert = ""; |
$referer_update = ""; |
|
while ($row = @spip_fetch_array($result)) { |
$id_article = $row['id_objet']; |
$visites = $row['visites']; |
$referer = addslashes($row['referer']); |
$referer_md5 = '0x'.$row['md5']; |
|
$referer_update[$visites][] = "(id_article=$id_article AND referer_md5=$referer_md5)"; |
$referer_insert[] = "('$date', '$referer', $referer_md5, $id_article, $visites)"; |
} |
|
// Mise a jour de la base |
if (is_array($referer_update)) { |
while (list($visites, $where) = each($referer_update)) { |
$query = "UPDATE spip_referers_articles SET visites = visites + $visites ". |
"WHERE ".join(' OR ', $where); |
$result = spip_query($query); |
} |
} |
if (is_array($referer_insert)) { |
$query_insert = "INSERT IGNORE INTO spip_referers_articles ". |
"(date, referer, referer_md5, id_article, visites) VALUES ".join(', ', $referer_insert); |
$result_insert = spip_query($query_insert); |
} |
|
// Effacer les referers traites |
if ($referer_vus) { |
spip_query("DELETE FROM spip_referers_temp WHERE $referer_vus"); |
} |
return $tous ; |
} |
|
|
// |
// Afficher les referers d'un article (ou du site) |
// |
function aff_referers ($query, $limit=10, $plus = true) { |
// Charger les moteurs de recherche |
$arr_engines = stats_load_engines(); |
|
$query .= " LIMIT 0,$limit"; |
$result = spip_query($query); |
|
while ($row = spip_fetch_array($result)) { |
$referer = interdire_scripts($row['referer']); |
$visites = $row['vis']; |
$tmp = ""; |
|
$buff = stats_show_keywords($referer, $referer); |
|
if ($buff["host"]) { |
$numero = substr(md5($buff["hostname"]),0,8); |
|
$nbvisites[$numero] = $nbvisites[$numero] + $visites; |
|
if (strlen($buff["keywords"]) > 0) { |
$criteres = substr(md5($buff["keywords"]),0,8); |
if (!$lescriteres[$numero][$criteres]) |
$tmp = " « ".$buff["keywords"]." »"; |
$lescriteres[$numero][$criteres] = true; |
} else { |
$tmp = $buff["path"]; |
if (strlen($buff["query"]) > 0) $tmp .= "?".$buff['query']; |
|
if (strlen($tmp) > 30) |
$tmp = "/".substr($tmp, 0, 27)."..."; |
else if (strlen($tmp) > 0) |
$tmp = "/$tmp"; |
} |
|
if ($tmp) |
$lesreferers[$numero][] = "<a href='$referer'>$tmp</a>" . (($visites > 1)?" ($visites)":""); |
else |
$lesliensracine[$numero] += $visites; |
$lesdomaines[$numero] = $buff["hostname"]; |
$lesurls[$numero] = $buff["host"]; |
$lesliens[$numero] = $referer; |
} |
} |
|
if (count($nbvisites) > 0) { |
arsort($nbvisites); |
|
$aff = "<ul>"; |
for (reset($nbvisites); $numero = key($nbvisites); next($nbvisites)) { |
if ($lesdomaines[$numero] == '') next; |
|
$visites = pos($nbvisites); |
$ret = "\n<li>"; |
|
if ($visites > 5) $ret .= "<font color='red'>$visites "._T('info_visites')."</font> "; |
else if ($visites > 1) $ret .= "$visites "._T('info_visites')." "; |
else $ret .= "<font color='#999999'>$visites "._T('info_visite')."</font> "; |
|
if (count($lesreferers[$numero]) > 1) { |
$referers = join ("</li><li>",$lesreferers[$numero]); |
$aff .= "<p />"; |
$aff .= $ret; |
$aff .= "<a href='http://".$lesurls[$numero]."'><b><font color='$couleur_foncee'>".$lesdomaines[$numero]."</font></b></a>"; |
if ($rac = $lesliensracine[$numero]) $aff .= " <font size='1'>($rac)</font>"; |
$aff .= "<ul><font size='1'><li>$referers</li></font></ul>"; |
$aff .= "</li><p />\n"; |
} else { |
$aff .= $ret; |
$lien = $lesreferers[$numero][0]; |
if (eregi("^(<a [^>]+>)([^ ]*)( \([0-9]+\))?", $lien, $regs)) |
$lien = $regs[1].$lesdomaines[$numero].$regs[2]; |
else |
$lien = "<a href='http://".$lesdomaines[$numero]."'>".$lesdomaines[$numero]."</a>"; |
$aff .= "<b>$lien</b>"; |
$aff .= "</li>\n"; |
} |
} |
$aff .= "</ul>"; |
|
// Le lien pour en afficher "plus" |
if ($plus AND (spip_num_rows($result) == $limit)) { |
$lien = $GLOBALS['clean_link']; |
$lien->addVar('limit',$limit+200); |
$aff .= "<div style='text-align:right;'><b><a href='".$lien->getUrl()."'>+++</a></b></div>"; |
} |
} |
|
|
return $aff; |
} |
|
?> |