Voici un script de statistiques Adsense à installer sur votre serveur web muni de PHP/MySQL.
Pour plus d'informations : le sujet sur WRI
Procédure d'installation :
1) Création de la base :
Lancez cette requête SQL dans PhpMyAdmin ou équivalent :
CREATE TABLE `adsense` (
`ref` varchar(25) NOT NULL default '',
`url` varchar(255) NOT NULL default '',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`counts` int(11) NOT NULL default '0'
) TYPE=MyISAM COMMENT='AdSense tracking';
2) Installation du script de comptage :
Installez le script qui suit sur votre serveur, là où vous le souhaitez. Le nom que l'on utilisera ici sera log.php (vous pouvez le changer si besoin)
A configurer :
- les paramètres de connexion à la base (localhost, user, password)
- le nom de la base (votre base)
<?
$ref = trim(preg_replace('~[^a-z0-9_\\\\\-\.:/]+~i',' ',$_GET['ref']));
$url = trim(preg_replace('~^.* (.*?)$~i','\\1',$_GET['url']));
if (!empty($ref) && !empty($url)) {
// A configurer ! La connexion à la base MySQL :
$db = mysql_connect('localhost','user','password');
mysql_select_db('votre base',$db);
if ($url == 'count') { // Un hit d'affichage
if (mysql_num_rows(mysql_query("SELECT 1 FROM adsense WHERE ref = '$ref' AND url = '#' AND date LIKE '".date("Y-m-d H:")."%' LIMIT 1")) != 0)
mysql_query("UPDATE adsense SET counts = counts + 1 WHERE ref = '$ref' AND url = '#' AND date LIKE '".date("Y-m-d H:")."%'");
else mysql_query("INSERT INTO adsense (ref, url, date, counts) VALUES ('$ref','#','".date("Y-m-d H:i:s")."',1)");
} else { // Un hit de clic
if (mysql_num_rows(mysql_query("SELECT 1 FROM adsense WHERE ref = '$ref' AND url = '$url' AND date LIKE '".date("Y-m-d H:")."%' LIMIT 1")) != 0)
mysql_query("UPDATE adsense SET counts = counts + 1 WHERE ref = '$ref' AND url = '$url' AND date LIKE '".date("Y-m-d H:")."%'");
else mysql_query("INSERT INTO adsense (ref, url, date, counts) VALUES ('$ref','$url','".date("Y-m-d H:i:s")."',1)");
}
}
?>
3) Test du code log.php :
Il est nécessaire à ce stade de tester si le code réagit bien. Pour cela, appelez successivement ces 2 pages :
http://www.votresite.net/log.php?ref=1234&url=count
http://www.votresite.net/log.php?ref=1234&url=www.test.com
Aucune erreur ne doit s'afficher, et aucun texte non plus d'ailleurs :o)
Maintenant direction votre base de données avec phpMyAdmin ou équivalent :
Regardez les enregistrements dans la table 'adsense', vous devez en trouver 2 :
ref url date counts
1234 # 2004-03-18 21:01:25 1
1234 www.test.com 2004-03-18 21:04:21 1
Si vous avez ces 2 enregistrements (la date sera forcément différente), c'est parfait ! Vous pouvez les supprimer (en vidant la table)
4) Installation du code Javascript :
Le code Javascript de récupération des stats à mettre sur vos pages :
Doivent être modifiés :
- l'indice de zone (lettres ou chiffres exclusivement [a-z0-9], mais tout attaché et 25 caractères max), qui définiront les zones de votre site plutôt que d'utiliser vos urls
- le lien vers le fichier de log des informations (log.php)
<script type="text/javascript">
<!--
ref = 'REFERENCE_DE_ZONE'; // Notez les guillements (simples ou doubles) autour de la référence de zone
bug = new Image();
bug.src = 'http://www.votresite.net/log.php?ref=' + ref + '&url=count';
function log() { bug.src = 'http://www.votresite.net/log.php?ref=' + ref + '&url=' + window.status; }
var elements;
elements = document.getElementsByTagName('iframe');
for (var i = 0; i < elements.length; i++) {
if ((elements[i].src.indexOf('googlesyndication.com') > -1) || (elements[i].src.indexOf('googleadservices.com') > -1)) { elements[i].onfocus = log; }
}
//-->
</script>
Si tout va bien, vous pourrez voir votre table se remplir petit à petit sur phpMyAdmin...
5) Installation du code des statistiques :
La date de dernière modification de ce fichier est le : 04 Jan 2007 à 12h11. Attention si la date est très proche de l'heure actuelle (04 Jul 2009 - 14h43), il se peut que je sois en train de modifier le fichier ! Donc il peut y avoir des bugs...
A configurer :
- les paramètres de connexion à la base (localhost, user, password);
- le nom de la base (votre base);
- l'emplacement de l'image transparente : /images/spacer.gif (GIF transparent, de 1x1 pixel, si elle n'existe pas ça marchera aussi mais vous aurez des erreurs 404);
<?php
// Connexion à la base !
$db = mysql_connect('localhost','user','password');
mysql_select_db('votre base',$db);
// Emplacement de l'image transparente (GIF 1x1 pixel) :
$img = '/images/spacer.gif';
$year1 = sprintf('%04d',isset($_GET['year1']) ? $_GET['year1'] : date('Y'));
$month1 = sprintf('%02d',isset($_GET['month1']) ? $_GET['month1'] : date('m'));
$day1 = sprintf('%02d',isset($_GET['day1']) ? $_GET['day1'] : date('d'));
$year2 = sprintf('%04d',isset($_GET['year2']) ? $_GET['year2'] : date('Y'));
$month2 = sprintf('%02d',isset($_GET['month2']) ? $_GET['month2'] : date('m'));
$day2 = sprintf('%02d',isset($_GET['day2']) ? $_GET['day2'] : date('d'));
$ref = isset($_GET['ref']) ? preg_replace('~[^a-z0-9_\\\\\-\.:/]+~i',' ',$_GET['ref']) : '';
$url = isset($_GET['url']) ? preg_replace('~[^a-z0-9_\\\\\-\.:/]+~i',' ',$_GET['url']) : '';
$td = array( 'hours' => array('_' => 'Heures', 'color' => '#F0F0F0'),
'clicks_zone' => array('_' => 'Clicks', 'color' => '#9999FF'),
'counts_zone' => array('_' => 'Affichages', 'color' => '#99FF99'),
'ratio_zone' => array('_' => 'CTR (%)', 'color' => '#FF9999'),
'images_zone' => array('_' => '', 'color' => '#F0F0F0'),
'images_comp' => array('_' => 'Comparaison<br/>du taux<br/>', 'color' => '#F0F0F0'),
'ratio_comp' => array('_' => 'de click (%)', 'color' => '#FFFF99'),
'clicks_all' => array('_' => 'Clicks', 'color' => '#BBBBFF'),
'counts_all' => array('_' => 'Affichages', 'color' => '#BBFFBB'),
'ratio_all' => array('_' => 'CTR (%)', 'color' => '#FFBBBB'),
'images_all' => array('_' => '', 'color' => '#F0F0F0'));
$max = array( 'clicks_zone' => 1, 'counts_zone' => 1, 'ratio_zone' => 0.00001, 'ratio_comp' => 100,
'clicks_all' => 1, 'counts_all' => 1, 'ratio_all' => 0.00001);
$results = mysql_query("SELECT ref FROM adsense WHERE TO_DAYS(date) >= TO_DAYS('$year1-$month1-$day1') AND TO_DAYS(date) <= TO_DAYS('$year2-$month2-$day2') GROUP BY ref");
$refs = array();
while ($refs[] = mysql_fetch_object($results));
array_pop($refs);
$results = mysql_query("SELECT url, SUM(counts) AS total FROM adsense WHERE url != '#' AND ref LIKE '".($ref == '' ? '%' : $ref)."' AND TO_DAYS(date) >= TO_DAYS('$year1-$month1-$day1') AND TO_DAYS(date) <= TO_DAYS('$year2-$month2-$day2') GROUP BY url");
$urls = array();
while ($urls[] = mysql_fetch_object($results));
array_pop($urls);
$zones = array('zone','all');
for ($i = 0; $i < 24; $i++) {
reset($zones);
while (list(,$zone) = each($zones)) {
if ($ref == '' && $url == '' || $zone == 'all' && ($ref != '' && $url == '' || $ref == '' && $url != '')) {
$td["images_$zone"]['_'] = 'Toutes les zones<br/>Toutes les pubs';
$where_aff = "ref LIKE '%' AND url = '#'";
$where_clk = "ref LIKE '%' AND url != '#'";
} elseif ($zone == 'zone' && $ref != '' && $url == '' || $zone == 'all' && $ref != '' && $url != '') {
$td["images_$zone"]['_'] = "Cette zone ($ref)<br/>Toutes les pubs";
$where_aff = "ref = '$ref' AND url = '#'";
$where_clk = "ref = '$ref' AND url != '#'";
} elseif ($zone == 'zone' && $ref == '' && $url != '') {
$td["images_$zone"]['_'] = "Toutes les zones<br/>Cette pub ($url)";
$where_aff = "ref LIKE '%' AND url = '#'";
$where_clk = "ref LIKE '%' AND url = '$url'";
} elseif ($zone == 'zone' && $ref != '' && $url != '') {
$td["images_$zone"]['_'] = "Cette zone ($ref)<br/>Cette pub ($url)";
$where_aff = "ref LIKE '$ref' AND url = '#'";
$where_clk = "ref LIKE '$ref' AND url = '$url'";
}
$aff = mysql_fetch_object(mysql_query(" SELECT SUM(counts) AS Counts
FROM adsense
WHERE TO_DAYS(date) >= TO_DAYS('$year1-$month1-$day1') AND TO_DAYS(date) <= TO_DAYS('$year2-$month2-$day2')
AND HOUR(date) = $i
AND $where_aff"));
$clicks = mysql_fetch_object(mysql_query(" SELECT SUM(counts) AS Clicks
FROM adsense
WHERE TO_DAYS(date) >= TO_DAYS('$year1-$month1-$day1') AND TO_DAYS(date) <= TO_DAYS('$year2-$month2-$day2')
AND HOUR(date) = $i
AND $where_clk"));
$max["clicks_$zone"] = max($clicks->Clicks, $max["clicks_$zone"]);
$max["counts_$zone"] = max($aff->Counts, $max["counts_$zone"]);
$max["ratio_$zone"] = max($aff->Counts == 0 ? 0 : $clicks->Clicks/$aff->Counts*100, $max["ratio_$zone"]);
$td["clicks_$zone"][$i] = $clicks->Clicks;
$td["counts_$zone"][$i] = $aff->Counts;
$td["ratio_$zone"][$i] = round($aff->Counts == 0 ? 0 : $clicks->Clicks/$aff->Counts * 100,2);
}
$td['ratio_comp'][$i] = round($td['clicks_all'][$i] == 0 ? 0 : $td['clicks_zone'][$i]/$td['clicks_all'][$i] * 100,2);
$td['hours'][$i] = $i.'h';
}
$td['hours'][24] = 'Total';
$td['clicks_zone'][24] = array_sum($td['clicks_zone']);
$td['counts_zone'][24] = array_sum($td['counts_zone']);
$td['ratio_zone'][24] = round($td['counts_zone'][24] == 0 ? 0 : $td['clicks_zone'][24]/$td['counts_zone'][24] * 100,2);
$td['clicks_all'][24] = array_sum($td['clicks_all']);
$td['counts_all'][24] = array_sum($td['counts_all']);
$td['ratio_all'][24] = round($td['counts_all'][24] == 0 ? 0 : $td['clicks_all'][24]/$td['counts_all'][24] * 100,2);
$td['ratio_comp'][24] = round($td['clicks_all'][24] == 0 ? 0 : $td['clicks_zone'][24]/$td['clicks_all'][24] * 100,2);
for ($i = 0; $i <= 24; $i++) {
reset($td);
while (list($key,) = each($td)) {
if (preg_match('~images|hour~i',$key) || !preg_match('~_(zone|all|comp)~i',$key,$match)) continue;
if (!isset($td['images_'.$match[1]][$i])) $td['images_'.$match[1]][$i] = $i == 24 ? '<img src="'.$img.'" style="width:0px;height:100px;"/>' : '';
$td['images_'.$match[1]][$i] .= '<img src="'.$img.'" style="width:5px;height:'.min(100,ceil(100/$max[$key] * $td[$key][$i])).'px;background-color:'.$td[$key]['color'].'; border:1px solid white;"/>';
}
}
?>
<html>
<head>
<title>Stats Adsense</title>
</head>
<style>
body {
margin: 5px;
font-family:Arial, Helvetica;
font-size:9pt;
}
form {
margin:0px;
font-size:9pt;
}
input {
font-size:9pt;
border:1px solid black;
}
table {
font-size:9pt;
}
</style>
<body>
<h2 align="center">Stats Adsense</h2>
<table border="0" cellpadding="0" cellspacing="1" width="100%">
<form id="F" action="<?=$_SERVER['PHP_SELF']?>?ref=<?=$ref?>&url=<?=$url?>" method="get">
<tr>
<td wrap="off">
Du <select name="day1"><option>Jour</option><? for ($i = 1; $i <= 31; $i++) echo '<option value="'.$i.'"'.($day1 == $i ? ' selected="selected"' : '').'>'.$i.'</option>';?></select>
<select name="month1"><option>Mois</option><? for ($i = 1; $i <= 12; $i++) echo '<option value="'.$i.'"'.($month1 == $i ? ' selected="selected"' : '').'>'.date('M',strtotime("2004-$i-01")).'</option>';?></select>
<select name="year1"><option>Année</option><? for ($i = 2004; $i <= date('Y'); $i++) echo '<option value="'.$i.'"'.($year1 == $i ? ' selected="selected"' : '').'>'.$i.'</option>';?></select><br/>
Au <select name="day2"><option>Jour</option><? for ($i = 1; $i <= 31; $i++) echo '<option value="'.$i.'"'.($day2 == $i ? ' selected="selected"' : '').'>'.$i.'</option>';?></select>
<select name="month2"><option>Mois</option><? for ($i = 1; $i <= 12; $i++) echo '<option value="'.$i.'"'.($month2 == $i ? ' selected="selected"' : '').'>'.date('M',strtotime("2004-$i-01")).'</option>';?></select>
<select name="year2"><option>Année</option><? for ($i = 2004; $i <= date('Y'); $i++) echo '<option value="'.$i.'"'.($year2 == $i ? ' selected="selected"' : '').'>'.$i.'</option>';?></select>
<input type="submit" value="OK"/>
</td>
<td>
<select name="ref" onchange="document.getElementById('url').value='';document.getElementById('F').submit();"><option value="">Toutes les zones</option><? for ($i = 0; $i < count($refs); $i++) echo '<option value="'.$refs[$i]->ref.'"'.($ref == $refs[$i]->ref ? ' selected="selected"' : '').'>'.$refs[$i]->ref.'</option>';?></select>
<input type="submit" value="OK"/>
</td>
<td>
<select name="url" id="url" onchange="document.getElementById('F').submit();"><option value="">Toutes les url</option><? for ($i = 0; $i < count($urls); $i++) echo '<option value="'.$urls[$i]->url.'"'.($url == $urls[$i]->url ? ' selected="selected"' : '').'>'.$urls[$i]->url.' ('.$urls[$i]->total.' clicks)</option>';?></select>
<input type="submit" value="OK"/>
</td>
</tr>
</form>
</table>
<table cellpadding="1" cellspacing="1">
<?
reset($td);
while (list($key,) = each($td)) {
echo '<tr>';
echo '<td style="background-color:'.$td[$key]['color'].'">'.$td[$key]['_'].'</td>';
for($i = 0; $i <= 24; $i++) echo '<td valign="bottom" style="background-color:'.$td[$key]['color'].($i == 24 ? ';font-weight:bold;' : '').'">'.$td[$key][$i].'</td>';
echo '</tr>';
}
?>
</table>
</body>
</html>
Mettez ce fichier PHP où bon vous semble, mais surtout pas à disposition du premier venu ;o) Lancez-le ensuite depuis votre serveur web et admirez le résultat :o)