Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

Bonjour,

 

j'essaie de créer un flux RSS via PHP5.

J'ai honteusement pompé l'exemple de ce tutorial fort bien documenté:

http://baptiste-wicht.developpez.com/tutoriel/php/rss/

 

Un fichier RSSPHP.php contenant les fonctions d'ouverture, ajout de news, fermeture du fichier XML:

<?php
/*
Méthodes d'ouverture, création, ajout de news RSS dans un fichier XML
*/

function openXML(){

   // Ouverture du fichier
   $file = new DOMDocument();
   $file->load("RSS.xml"); 

   //On retourne le fichier
   return $file;
}

function createXML(){

   // Création du fichier en mémoire 
   $file = new DOMDocument("1.0");

   // Création du noeud racine
   $root = $file->createElement("rss"); //On crée l élément racine
   $root->setAttribute("version", "2.0"); //On lui ajoute l attribut version (2.0)
   $root = $file->appendChild($root); //On insère la racine dans le document

   // Création du noeud channel 
   $element_channel = $file->createElement("channel");//On crée un élément channel
   $element_channel->setAttribute("id", "news"); //On donne un attribut id à notre channel
   $element_channel = $root->appendChild($element_channel);//On ajoute cet élément à la racine

   // Création du noeud description 
   $element_description = $file->createElement("description");//On crée un élément description
   $element_description = $element_channel->appendChild($element_description);//On ajoute cet élément au channel

   // Création du texte pour le noeud description 
   $texte_description = $file->createTextNode("L'actualité du xyz"); //On crée un texte
   $texte_description = $element_description->appendChild($texte_description); //On insère ce texte dans le noeud description

   // Création du noeud link et ajout du texte à l élément 
   $element_link = $file->createElement("link");
   $element_link = $element_channel->appendChild($element_link);
   $texte_link = $file->createTextNode("http://127.0.0.1/xyz");
   $texte_link = $element_link->appendChild($texte_link);

   // Création du noeud title et ajout du texte à l élément 
   $element_title = $file->createElement("title");
   $element_title = $element_channel->appendChild($element_title);
   $texte_title = $file->createTextNode("Fil RSS du xyz");
   $texte_title = $element_title->appendChild($texte_title);

   //On retourne le fichier XML
   return $file;
}

function addOneNews($file, $title, $date){

   //On récupère le channel
   $element_channel = $file->getElementById("news");

   // Création du noeud item
   $element_item = $file->createElement("item");
   $element_item = $element_channel->appendChild($element_item);

   // Création du noeud title et ajout du texte à l élément 
   $element_title = $file->createElement("title");
   $element_title = $element_item->appendChild($element_title);
   $texte_title = $file->createTextNode($title);
   $texte_title = $element_title->appendChild($texte_title);

   // Création du noeud link et ajout du texte à l élément 
   $element_link = $file->createElement("link");
   $element_link = $element_item->appendChild($element_link);
   $texte_link = $file->createTextNode("Lien vers la news");
   $texte_link = $element_link->appendChild($texte_link);

   // Création du noeud pubDate et ajout du texte à l élément 
   $element_date = $file->createElement("pubDate");
   $element_date = $element_item->appendChild($element_date);
   $texte_date = $file->createTextNode($date);
   $texte_date = $element_date->appendChild($texte_date);

}

function saveXML($file){

   //Sauvegarde du fichier
   $file->save("RSS.xml");
}


?>

 

et le code associé pour créer le fichier XML et ajouter les 2-3 news déjà présentes dans la BDD

<?php
require("RSSPHP.php");

//Création du fichier XML
$file = createXML();

mysql_connect("localhost","user","password") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

$query_news = mysql_query("SELECT DATE_FORMAT(date, '%d-%m-%Y') as date, titre, texte, image FROM news") or die(mysql_error());

while($data_news = mysql_fetch_array($query_news)){
 //echo $data_news['titre']."<br />"; débogage pour vérifier que les data sont bien extraites
 //echo $data_news['date']."<br />";
   addOneNews($file,$data_news['titre'],$data_news['date']);
}

mysql_close();


saveXML($file);

?>

 

La fonction addOneNews me renvoie une erreur

[b]Fatal error[/b]:  Call to a member function appendChild() on a non-object in <[b]adresse du site>/RSSPHP.php[/b] on line [b]62[/b]

 

cette ligne 62 correspond à l'ajout de la section item dans le channel d'id "news":

$element_item = $element_channel->appendChild($element_item);

serait-ce $element_channel qui serait mal instancié ?

 

c'est la méthode getElementById() qui déconne ?

en lisant la doc j'ai essayé de valider le document par

$file->validate();

en fin de fonction CreateXML() mais sans succès

(enfin si il m'engueule parce que il n'y a pas de DTD de défini dans le document XML)

Si je me contente de créer le fichier XML sans faire de requête d'ajout

de news, j'obtiens ce fichier XML qui me semble avoir le bon format:

 

<?xml version="1.0"?>

<rss version="2.0">

 <channel id="news">

<description>L'actualité du xyz</description>

  <link>http://127.0.0.1/xyz</link>

	<title>Fil RSS du xyz</title>

 </channel>

</rss>

 

:P

Posté(e)

bon ben fallait juste rajouter

$element_channel->setIdAttribute("id", TRUE);

 

après

$element_channel->setAttribute("id", "news");

de la fonction CreateXML() pour que la chaine id soit reconnue comme un ElementId

 

Résolu

Posté(e)

arrrrrrrrrrgghhh

 

J'obtiens la même erreur lorsque je veux insérer de nouvelles news via un formulaire

le modèle d'insertion est le suivant à partir d'informations saisies via un formulaire

extract($_POST);

require("RSSPHP.php");

mysql_connect("localhost","pseudo","mdp") or die(mysql_error());
mysql_select_db("db") or die(mysql_error());

//Ajout de la news dans la base de données
mysql_query("INSERT INTO news (titre, timestamp, contenu, auteur) VALUES 
('" . $title . "','" . $timestamp . "','" . $contents . "','" . $author . "')") or die(mysql_error());

//Ouverture du fichier
$file = openXML();

//Ajout de la news dans le fichier
addOneNews($file, $title, $timestamp, $author);

saveXML($file);

mysql_close();

 

On utilise cette fois la fonction openXML() et non plus createXML() vu que le fichier existe déjà.

Autant dans createXML(), je pouvais définir "id" comme attribut d'identification via DOMElement->setIdAttribute() car l'élément DOM $element_channel est existant.

 

Dans openXML(), j'obtiens juste un DOMDocument : $file auquel je ne peux pas appliquer la méthode setIdAttribute()

 

DOMDocument->getElementById() ne marche pas car l'identifiant "id" n'est pas activé

DOMDocument->getElementsByTagName() me renvoie un DOMNodeList dont je ne sais que faire..

 

ou alors il faut que je renseigne un DTD dans le fichier xml mais je ne vois pas comment faire ?

Posté(e)

La DOMNodeList se parcourt, et chaque Node de la liste est normalement capable de te fournir les données qu'il contient (avec son attribut data) et les valeurs de ses attributs (avec un getAttribute())... Enfin, si c'est implémenté pareil que le modèle DOM qui est utilisé en Javascript...

Ca m'étonne que l'attribut "id" des balises ne soit pas universellement reconnu comme désignant l'id du Node ... A moins que ce ne soit défini dans le DTD auquel cas il suffit d'ajouter après l'entête XML une balise DOCTYPE indiquant le bon DTD...

Par exemple :

<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
"http://my.netscape.com/publish/formats/rss-0.91.dtd">

 

-- edit --

A moins que la possibilité d'indiquer un DTD ait été virée de rss 2.0 ... J'arrive pas à mettre la main sur des specs claires à ce niveau-là :-/

Posté(e)

remoi :P

 

j'ai rajouté manuellement un DOCTYPE dans le fichier xml

<!DOCTYPE rss [
<!ATTLIST channel id ID #IMPLIED>
]>

 

et ça fonctionne ...

on va dire que c'est résolu

Posté(e)

IE de mes **%%$*%!

Internet Explorer ne peut pas afficher ce flux

 

Internet Explorer ne prend pas en charge les flux avec DTD.

Aller à la page précédente.

 

Informations

 

Ce flux contient une DTD (définition de type de document). Les DTD sont utilisées pour définir la structure d’une page Web. Internet Explorer ne prend pas en charge les DTD dans les flux.

 

IE :P

Posté(e)

salut GreyWolf,

perso, les DTD avec Php, je ne les fais pas... ce n'est pas obligatoire, et comme tu peux le voir, c'est assez prise de tête ^^

Posté(e)

Retour à la case départ, du coup ?

 

IE de mes **%%$*%!
Pas mieux.

A propos d'IE, j'attends avec impatience de voir le résultat de l'update forcée de IE7 la semaine prochaine... On va bientôt pouvoir se débarrasser de tous les "hacks" pourris mis en place à cause d'IE6 ?

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...