Créer un flux RSS avec une base de données SQL

Pour créer un flux RSS avec des requêtes SQL, nous utiliserons en exemple le format Wordpress très répandu. Wordpress dispose bien sûr d'un générateur de flux mais le but est didactique et l'exemple pourra servir de base à la réalisation d'un générateur plus personnalisé. Il peut s'appliquer à d'autres bases de données que celle de Wordpress en adaptant le nom des colonnes.

Définition de la table théorique

Les articles contiennent au moins les données suivantes:

  1. Lien, URL de la page.
  2. Titre.
  3. Description, résumé de l'article.
  4. Date.
  5. Texte de l'article.

Eventuellement, nom d'auteur, une image.

Avec phpMyAdmin nous avons une vue de la structure des tables de notre base de donnée d'articles de blog.

Ce qui nous intéresse, c'est la table posts qui contient les billets, si le préfix choisi est blog, le nom sera blog_posts.
La structure contient de nombreuses données que nous n'utiliserons pas. La chaîne post est utilisée comme préfixe à la plupart des colonnes, ce sont ainsi les suivantes qui nous intéressent (nom suivi du type de données):

  1. post_modified datetime : la date de dernière modification.
  2. post_title text : le titre.
  3. post_excerpt text : (extrait) le résumé.
  4. guid text: l'identifiant unique de la page qui se trouve être aussi le nom du fichier.
  5. post_content text: le contenu.

L'URL est fabriquée sous Wordpress à partir du titre et de l'adresse du site, mais cela est pris pour créer l'identifiant placé dans guid, il nous suffira donc de reprendre ce dernier pour avoir le lien sur la page.

Mais à défaut de résumé, il faudra reprendra les premières lignes du texte de l'article.

On aura donc la table suivante:

guid
post_title
post_modified
post_content
http://www.scriptol.fr/
RSS et SQL
2008-01-03 17:24:01
Créer un flux RSS...
...
     

Avec autant de lignes qu'il y a d'articles dans le blog. Cette table servira de point de départ pour définir la requête.

Définition de la requête par un script PHP

Le script comporte les étapes suivantes:

  1. Connexion au serveur.
  2. Selection de la base.
  3. Lecture des articles selon une condition donnée, par exemple les n derniers postés. Le résultat sera dans un tableau.
  4. Ecriture du fichier XML au format RSS 2.0.
  5. Ultérieurement, affichage du flux.

La connexion au serveur

Le fonction PHP requiert le nom du serveur, le login utilisateur et un mot de passe, ces données ont permi d'installer Worpress:

$connexion = mysql_connect('mysql5-1', 'user', 'pass')

Le nom du serveur est généralement de la forme mysql... suivi du code de version.

La selection de la base

Le numéro de connexion retourné par la fonction précédente sera utilisé dans chaque transaction avec le serveur.

$result = mysql_select_db('mabase', $connexion); 

La valeur retournée est true si la base est trouvée, false sinon.

Lecture des articles

La commande SELECT ... FROM ... WHERE de SQL permet de retourner un ensemble d'articles selon une condition donnée.
Les arguments sont:

  1. Les colonnes dont on veut lire le contenu. On peut spécifier une colonne, une liste de colonnes séparée par une virgule ou le symbole * pour reprendre les données de toutes les colonnes. Dans cet exemple nous donnerons la liste des colonnes de la table théorique donnée précédemment car seuls ces champs nous intéressent.
    SELECT guid, post_title, post_modifier, post_content
  2. Le nom de la table est le second paramètre, en l'occurence blog_posts.
    SELECT ... FROM blog_posts
  3. La condition dans notre exemple, ce sont les 10 derniers articles. On ne donnera pas d'autre condition pour l'instant, la clause WHERE sera omise. Au contraire, on classera les articles par date en ordre descendant et on limite le nombre à 10.
  4. La clause ORDER BY permet de classer les articles par date s'associe à un nombre maximal. Et le paramètre DESC indique que l'ordre est inversé, donc à partir de l'article le plus récent plutôt qu'à partir du premier article.
    SELECT ... FROM ... ORDER BY post_modified DESC
  5. Le nombre maximal d'article est donné par la clause LIMIT.
    SELECT ... FROM ... ORDER BY post_modified DESC LIMIT 10

Le code PHP sera donc le suivant:

$command = "SELECT guid, post_title, post_modified, post_content FROM blog_posts ORDER BY post_modified DESC LIMIT 10";
$items = mysql_query($command, $connexion);

Nous avons maintenant le contenu des articles dans un tableau à deux dimensions, au premier niveau chaque ligne de la table, et au second niveau les données de chaque colonne.

[0]=> ligne 1
   [0]=> guid
   [1]=> post_title
   [2]=> post_modified
   [3]=> post_content
[1]=> ligne 2
   [0]=> guid
   [1]=> etc...

Il reste à extraire les données du tableau.

Utilisation des données de la base

En fait l'appel à la fonction mysql_query retourne une ressource, un identifieur correspondant aux données trouvées, il reste à extraire les données ce que l'on fera avec la fonction PHP mysql_fetch_assoc.

Cette fonction retourne une ligne du tableau et dans laquelle les valeurs sont associées à des clés qui sont fait le nom des colonnes.
On l'utilise de façon itérative pour obtenir chaque ligne de la table.

while($article = mysql_fetch_assoc($items))
{
   $url= $article["guid"];
   $title= $article["post_title"];
   $date= $article["post_date"];
   $content= $article["post_content"];
}

Nous avons récupéré les données des articles et nous avons maintenant ce qu'il faut pour créer le fichier XML du flux.

Créer un fichier RSS sous PHP 5

Avec la librairie RSS de l'éditeur RSS ARA, créer un fichier RSS peut se faire avec quelques fonctions:

ARAFeed($title, $url, $desc, $date)

Crée un objet flux. Le titre est le nom du blog, il est suivi par son URL, une description et la date du flux.

ARAItem($title, $url, $content, $date)

Ajoute un élement au flux avec les données extraites précédemment.

save($nomfichier)

Enregistre le flux créé dans un fichier.

Le code complet de génération du flux sera donc le suivant:

$rss = ARAItem($title, $url, $content, $date);
while($article = mysql_fetch_assoc($items))
{

   $url= $article["guid"];
   $title= $article["post_title"];
   $date= $article["post_date"];
   $content= $article["post_content"];
   $rss->ARAItem($title, $url, $content, $date)
}
$rss->save($nomfichier),

Ce code étant complété par les fonctions d'accès à la base de données, ce que l'on verra dans le source ci-dessous.

Afficher le flux

On peut voir directement le flux généré en donnant son URL au navigateur.

Le lecteur RSS peut être utilisé pour affiché le flux créé dans une page Web.

Télécharger le code source

Générateur RSS SQL.

Forum

Tutoriel RSS SQL et Wordpress, affichage de la date

25-07-2009 09:43:12

Gaillots

Bonjour, j'ai suivi ce tuto pour la création d'un flux de vidéos, mais j'ai deux petits souci. - Premièrement, j'ai bug d'encodage : [url]http://www.team-ncis.com/videos/RSS/rss.xml[/url] Si je passe en ISO ici :
 $rss = '<?xml version="1.0" encoding="UTF-8" ?>'."\n"[
; c'est les l'encodage des titres des entrées qui bug. - Deuxième chose, c'est les heures qui reste à 2h00 et ça avec n'importe quelle heure d'entrée. Si vous avez des idées ou si il vous faut plus d'information. :) Merci d'avance ! ^^
27-07-2009 08:59:31

webmaster

Bonjour Les navigateurs n'affichent pas directement le contenu du champ de date et heure pubDate de RSS 2.0, mais en font une interprétation, de là l'affichage erroné. Une nouvelle version a été mise en ligne afin de reformater la date stockée dans un champ SQL par Wordpress qui produit un affichage correct des informations. A cette occasion des modifications mineures ont été apportées au script avec l'ajout de la variable $suffix et le remplacement de $user par $dbname pour le nom de la base de données. En ce qui concerne le format des titres, pour moi le flux du lien ci-dessus s'affiche correctement.
27-07-2009 19:49:10

Gaillots

Maintenant les dates ne s'affichent plus dans Firefox mais fonctionnent bien sous IE. Ce n'est pas très grave encore mais quelque chose ne va pas sous FF chez moi. Je vous joins mes fichiers pour voir les changement d'encodage. Si cela ne vous parle pas, ce n'est pas bien grave. Merci quand même. Sébastien
27-07-2009 19:51:23

webmaster

Il manque le " GMT" pour le parseur du navigateur.
$rss .= "<pubDate>$date"." GMT</pubDate>\n";
Le script fonctionne sous tous les navigateurs normalement.
28-07-2009 09:53:52

Gaillots

Bon merci, ça marche. J'ai fais le changement et c'est bon. Merci en tout cas pour le temps passé par email à m'aider, vraiment très sympa. Bravo pour les tutos. ^^