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 == $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 == $clicks->Clicks/$aff->Counts 100,2);
    }
    
$td['ratio_comp'][$i] = round($td['clicks_all'][$i] == $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] == $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] == $td['clicks_all'][24]/$td['counts_all'][24] * 100,2);
$td['ratio_comp'][24]  = round($td['clicks_all'][24] == $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)