#99 - Créer un flux RSS pour PHP-Stats !

Publié le 27 décembre 2007 par Geraldb

Voici comment créer un flux RSS pour PHP-Stats (ou n'importe quel autre script utilisant une base MySQL)...

PHP-Stats est un script libre de statistiques utilisant une base MySQL. Ce n'est pas le plus performant mais je l'utilise depuis longtemps et pour l'usage que j'en fais, il est largement suffisant... sauf qu'il lui manque un flux RSS !

Je ne dois pas compter sur une nouvelle version puisque le développement semble être au point mort [1] pas plus que sur le seul forum français que j'ai pu trouver et qui ne semble plus être trop actif... Je vais donc me débrouiller seul... enfin presque !

PHP-Stats, MySQL et Flux RSS...

L'idée est simple : interroger une base de données MySQL et organiser les données dans un flux RSS qui pourra alors être lu via son agrégateur préféré (comme Netvibes) ou même un téléphone portable (avec une connexion WAP) sans même avoir besoin de s'identifier. Je décide de me limiter à trois champs : la date, le nombre de visiteurs et le nombre de pages visitées mais on peut lancer d'autres requêtes...

Pour info, PHP-Stats stocke ces données dans la table "php_stats_daily" et dans les champs "data" (la date), "visits" (le nombre de visiteurs) et "hits" (le nombre de pages vues). Il faut donc créer un fichier rss.php (pour le flux) ainsi qu'un fichier rss.xslt (pour la forme). Ces fichiers peuvent se trouver dans n'importe quel sous-répertoire du site...

Contenu du fichier "rss.php"

J'ai utilisé différentes sources pour arriver à ce fichier (qui fonctionne plutôt bien) :

<?
$dbhost = "sql.serveur.fr"; // Adresse du serveur SQL
$dblogin = "login"; // Login de connexion à votre base
$dbpass = "pass"; // Mot de passe
$dbbase = "base"; // Nom de la base SQL
$path_stats = "http://www.votre.site.com/admin.php"; // Lien  (en absolu)
$path_feed = "http://www.votre.site.com/fluxRSS/rss.xslt"; // Adresse du fichier .xslt (en absolu)
$blog = "Mon Site"; // Nom du site
$webmaster = "Votre nom"; // Nom du webmaster (attention aux accents)
$mail = "webmaster@votre.site.com"; // Mail du webmaster
$db = @mysql_connect("$dbhost", "$dblogin", "$dbpass") OR DIE("Erreur de connexion : ".mysql_error());
@mysql_select_db($dbbase,$db) OR DIE;
// On lance la requete SQL. Il est preferable d'exclure les stats du jour et de limiter la requete à 5 jours. Après, vous faites ce que vous voulez...
$query = "SELECT * FROM php_stats_daily ORDER BY data DESC LIMIT 1,5";
// Par exemple, pour lancer une requete sur 10 jours en incluant les stats du jour, on mettrait :
// $query = "SELECT * FROM php_stats_daily ORDER BY data DESC LIMIT 0,10";
$result = mysql_query ($query) or die("La requette a echoue : ".mysql_error());
$nb_msg = mysql_num_rows($result);
header("Content-Type: text/xml");
$xml = '<?xml version="1.0" encoding="US-ASCII"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="'.$path_feed.'" ?>'."\n";
$xml .='<rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>'
."\n";
$xml .='  <title>PHP Stats v1.9.2 - '.$blog.'</title>'."\n";
$xml .='  <link>'.$path_stats.'</link>'."\n";
$xml .='  <description>Statistiques des derniers jours</description>'."\n";
$xml .='  <language>fr</language>'."\n";
$xml .='  <generator>PHPStats</generator>'."\n";
$xml .='  <webMaster>'.$mail." (".$webmaster.')</webMaster>'."\n";
while ($msg_data = mysql_fetch_array($result))
{
$titre = $msg_data['data'];
$date = explode("-", $titre);
$visits = $msg_data['visits'];
$hits = $msg_data['hits'];
$news = stripslashes(trim($visits))." Visiteurs (".stripslashes(trim($hits))." Pages)";
$news = str_replace("<BR>",'<BR/>',$news);
$news = str_replace("&",'&amp;',$news);
$news = str_replace("<","<",$news);
$news = str_replace(">",">",$news);
$xml .='  <item>'."\n";
$xml .='    <title>'.$date[2].'/'.$date[1].'/'.$date[0].' : '.$visits.'</title>'."\n";
$xml .='    <link>'.$path_stats.'?action=details</link>'."\n";
$xml .='    <pubDate>'.date(r).'</pubDate>'."\n";
$xml .='    <guid isPermaLink="false">'.$titre.'</guid>'."\n";
$xml .='    <description>';
$xml .= $news;
$xml .='</description>'."\n".'    </item>'."\n";
}
$xml .='</channel>'."\n".'</rss>';
mysql_close(); //On ferme la connexion
echo $xml;      // On affiche le resultat
?>
Contenu du fichier "rss.xslt"

J'avoue que je me suis largement inspiré du fichier fournit par DotClear...

<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns="http://www.w3.org/1999/xhtml">

 
<xsl:output method="html"/>
<xsl:template match="/">
<html>
 <head>
   <title>S'abonner à PHP Stats v1.9.2</title>
   <style type="text/css">
   <![CDATA[
  body {
    font: 80% Verdana,Arial,sans-serif;
    margin: 20px 0;
    padding: 0 0;
    background: #fff;
    color: #000;
  }
  a { color: #039; }
  h1, h2 { font-family: Arial,sans-serif; }
  h1 { font-size: 160%; margin: 0; }
  h2 { font-size: 140%; font-weight: bold; margin: 0.5em 0 0.2em 0; }
  h2 a { text-decoration: none; }
  p { margin: 0 0 0.5em 0; }
  #page {
    margin: 0 80px;
  }
  #top {
    background: #036;
    padding : 1em;
    color: #fff;
  }
  #top a {
    color: #fff;
    text-decoration: none;
  }
  #what {
    padding: 1em;
    background: #eee;
    border-bottom: 1px solid #000;
    font-size: 80%;
  }
  #what p {
    margin: 0 0 0.5em 0;
  }
  #footer {
    border-top: 1px solid #000;
  }
  #items {
    background: #fff;
    color: inherit;
  }
  #items div {
    margin: 0 0 1em 0;
  }
  ]]>
   </style>
 </head>
 <body>
   <div id="page">
     <div id="top">
       <h1><a href="test"><xsl:value-of select="/rss/channel/title"/></a></h1>
       <p><xsl:value-of select="/rss/channel/description"/></p>
     </div>
     <div id="what">
     <h3>Qu'est ce qu'un fil RSS ?</h3>
     <p>Un fil RSS recueille les informations de mise à jour d'un site. Il fournit le contenu des billets ou des commentaires ou un extrait de ceux-ci, ainsi qu'un lien vers les versions complètes et quelques autres informations. Ce fil a pour vocation d'être lu par un <a href="http://fr.wikipedia.org/wiki/Agr%C3%A9gateur">agrégateur</a> RSS.</p>
     </div>
     <div id="items">
       <xsl:apply-templates select="//item"/>
     </div>
     <div id="footer">
       <p><xsl:value-of select="/rss/channel/copyright"/></p>
     </div>
   </div>
 </body>
</html>
</xsl:template>
<!\-- Item template -->
<xsl:template match="item">
 <div>
   <h2><a href="{link}"><xsl:value-of select="title"/></a></h2>
   <div class="item-content"><xsl:value-of select="description" /></div>
 </div>
</xsl:template>
</xsl:stylesheet>

Et au final, le fichier "rss.php" génère même un flux RSS valide !

A bientôt...

Notes

[1] Encore plus que mon blog ! C'est dire...