Page 1 sur 2

flux RSS bis...

Posté : 26 juin 2008, 11:31
par elerien
Bonjour,

Je viens de trouver un code pour faire un agrégateur de flux RSS. Seulement, quand je l'affiche via Wamp, il m'affiche les différents modules avec du code au milieu...

voici la partie du code source ayant le plus gros paragraphe non interprété... ( début du programme).
<?php
/*      Agrégateur RSS v1.0 - PHP4/MySQL
      © Didier YVER 2004
      http://www.ASP-PHP.net
*/

// PARAMETRES
$rub_path = "rubriques.xml";
$password = "toto";
$maxperpage = 40;
$refresh = 60; // minutes

	// Connexion
	mysql_connect("localhost","root","");
	mysql_select_db("rss");

	// Extrait le nom du site de l'url
	function site($url) 
	{
	   $site = parse_url($url);
	   return str_replace("www.","",$site["host"]);
	}

	// Date française (Merci Fabrice :)
	function datefr($time) 
	{
	   setlocale(LC_TIME, "fr");
	   return ucfirst(strftime("%A %d %B %Y",$time));
	}

	// Lecture d'un fichier XML
	function lit_xml($chaine,$item,$champs)
	{
		// on explode sur item
		$tmp = preg_split("/<\/?".$item.">/",$chaine);
		// pour chaque item
		for($i=1;$i<sizeof($tmp)-1;$i+=2) 
		{
			$tmp3[$i-1][] = $tmp[$i];
			// on lit les champs demandés champ
			foreach($champs as $champ) 
			{
				$tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
		        // on ajoute au tableau
		        $tmp3[$i-1][] = @$tmp2[1];
			}
		}
		// et on retourne le tableau
		return @$tmp3;
	}

	// utf8_decode déconne parfois
	function smart_utf8_decode($in_str) 
	{ 
		// Replace ? with a unique string 
		$new_str = str_replace("?", "q0u0e0s0t0i0o0n", $in_str); 
		// Try the utf8_decode 
		$new_str=utf8_decode($new_str); 
		// if it contains ? marks 
		if (strpos($new_str,"?") !== false) 
		{ 
			// Something went wrong, set new_str to the original string. 
			$new_str=$in_str; 
		} else 
		{ 
			// If not then all is well, put the ?-marks back where is belongs 
			$new_str = str_replace("q0u0e0s0t0i0o0n", "?", $new_str); 
		}
		$new_str = str_replace("&apos;","'",$new_str); // RC t'es chiant :)
		return $new_str; 
	}

	// Mise à jour de la base
	function lit_rss($url) 
	{
		global $db;
		// Récupération de l'ID du flux
		$result = mysql_query("SELECT ID FROM flux WHERE url='".$url."'");
		$id = mysql_result($result,0,0);
		// Lecture du flux
		if($chaine = @implode("",@file($url))) 
		{
			$flux=lit_xml($chaine,"channel",array("title"));
			$titre = $flux[0][1];
			// Mise à jour du flux
			mysql_query("UPDATE flux SET titre='".addslashes($titre)."',maj=".time()." WHERE ID=".$id);
			$items = lit_xml($chaine,"item",array("title","link","pubDate","description"));
			// Pour chaque item
			foreach($items as $item) 
			{
				// On récupère les champs
				$date = @strtotime($item[3]); if(!$date) $date=time();
				$titre = $item[1];
				$lien = $item[2];
				$desc = $item[4]; 
				if($desc==$titre) $desc="";
				// Anti-doublon sur URL
				$result = mysql_query("SELECT ID FROM item WHERE lien='".$lien."' AND IDflux=".$id);
				
				// Mise à jour
				if(mysql_num_rows($result)>0) 
				{
					mysql_query("UPDATE item SET titre='".addslashes($titre)."',description='".addslashes($desc)."' WHERE ID=".mysql_result($result,0,0));
				// ou ajout à la BD
				} 
				else 
				{	 
					mysql_query("INSERT INTO item(IDflux,titre,lien,pubdate,description) VALUES(".$id.",'".addslashes($titre)."','".$lien."',".$date.",'".addslashes($desc)."')");
				}
			}
		}
	}

	if($isAdmin) 
	{
		// Ajout d'un flux
		if(@$_POST["flux"]) 
		{
			// Test validité de l'url
			if(!lit_xml($chaine = @implode("",@file($_POST["flux"])),"channel",array("title")))
				$error = "[".$_POST["flux"]."] n'est pas un flux RSS !";
			else 
			{
				// Test anti-doublon
				$result = mysql_query("SELECT * FROM flux WHERE url='".$_POST["flux"]."'");
				if(mysql_num_rows($result)<1) 
				{
					// Ajout à la table flux
					$SQL = "INSERT INTO flux(url,rubrique) VALUES('".$_POST["flux"]."','";
					// rubrique saisie ou choisie dans la liste ?
					if(@$_POST["rubrique"]) $SQL.=$_POST["rubrique"];
					elseif(@$_POST["listrub"]) $SQL.=$_POST["listrub"];
					$SQL.="')";
					mysql_query($SQL);
					// et va lire le flux
					lit_rss($_POST["flux"]);
				}
			}
		}
		
		// Destruction d'un flux
		if(@$_GET["delflux"]) 
		{
		    mysql_query("DELETE FROM flux WHERE ID=".$_GET["delflux"]);
		    mysql_query("DELETE FROM item WHERE IDflux=".$_GET["delflux"]);
		    mysql_query("OPTIMIZE TABLE flux"); // compresse la bd
		    mysql_query("OPTIMIZE TABLE item");
		    mysql_close();
		    Header("Location: ".$_SERVER["PHP_SELF"]);
		}
		
		// Génération du fichier xml contenant la liste des channels
		if(@$_GET["action"]=="generexml") 
		{
			$xml = "<"."?xml version='1.0' encoding='ISO-8859-1'?".">\n<liste>\n";
			$result = mysql_query("SELECT * FROM flux ORDER BY lower(rubrique),lower(titre)");
			$tmp = "";
			// pour chaque flux
			while($val=mysql_fetch_array($result)) 
			{
				// si la rubrique a changé -> nouveau channel
				if($tmp!=$val["rubrique"]) 
				{
					if($tmp) $xml.="</channel>\n";
					$xml.="<channel>\n<title>".$val["rubrique"]."</title>\n";
					$tmp = $val["rubrique"];
				}
				// Ajoute le flux en item
				$xml.="<item>\n<title>".$val["titre"]."</title>\n<link>".$val["url"]."</link>\n</item>\n";
			}
			if($tmp) $xml.="</channel>\n";
			$xml.="</liste>";
			// et enregistre le tout
			$f = fopen($rub_path,"w"); fputs($f,utf8_decode($xml)); fclose($f);
		}
	}

	// Mise à jour de la base (lecture de tous les flux non encore à jour - cf $refresh)
	function update() 
	{
		global $db,$refresh;
		set_time_limit(300); // parfois c'est un peu long :)
		$result = mysql_query("SELECT url FROM flux WHERE maj<".(time()-$refresh*60));
		while($val=mysql_fetch_array($result))
			lit_rss($val["url"]);
	}
	update();   

	// Affichage
?>	
il m'affiche a partir de :
/",$chaine); // pour chaque item for($i=1;$i/",$tmp[$i]);
... jusqu'à la fin de la balise php :
update();
 // Affichage
 ?> 
d'avance merci de votre aide.

Posté : 26 juin 2008, 12:08
par katagoto
Je sais pas si ça vient de ça, mais ton script à été codé pour PHP 4 alors que WAMP est sous PHP 5.2

Un petit script basé sur DOM serait très efficasse pour gérer ça...

Posté : 26 juin 2008, 15:13
par elerien
Heu... je veux bien... mais su DOM, c'est du XML, non?

Posté : 26 juin 2008, 16:10
par katagoto
C'est un class qui permet de gérer le XML très facilement :lol:

Jette un oeuil, c'est très interessant :

Un exemple : http://php.developpez.com/sources/?page=xml
La doc officielle : http://fr3.php.net/manual/fr/book.dom.php

Posté : 26 juin 2008, 16:20
par elerien
Ok je regarde merci...

Posté : 27 juin 2008, 09:27
par elerien
Sinon, on m'a dit de le faire en PHP objet... J'ai trouvé deux ou trois trucs mais ça me dit rien...

Posté : 27 juin 2008, 11:00
par katagoto
Un class par définition, c'est de la POO, mais c'est pas méchant ^^

Posté : 27 juin 2008, 11:07
par mcorgnet
C'est un class qui permet de gérer le XML très facilement :lol:
Pour une définition valide du DOM, ici :

http://fr.wikipedia.org/wiki/Document_Object_Model

Il faut faire attention à ce que tu expliques à des gens, qui ont tendance à gober tout ce qu'on leur dit sans vérifier, parce qu'ils viennent ici pour avoir des conseils de "pros".

En gros, le DOM, pour raccourcir, et dans le web, c'est ce qui permet à travers javascript d'agir sur tous les objets envoyés chez le client. Mais pas seulement. Suivez le lien pour plus d'informations.

Posté : 27 juin 2008, 11:14
par Hywan
Hey :),
C'est un class qui permet de gérer le XML très facilement :lol:
Euh non …DOM signifie Document Object Model, c'est une interface de représentation d'un langage. Le DOM W3C permet de définir de manière précise la construction d'un document. Le DOM sert pour des documents à balisage, donc XML s'y prête bien.
En plus de définir la représentation, le DOM permet accessoirement de manipuler la représentation, la structure, du langage. Ça passe par l'ajout, suppression, etc. de l'arbre généré (dans le cas XML, car XML se représente sous forme d'arbre, tout comme tous les langages à balisage).

Le DOM est avant tout une interface de représentation, plutôt qu'un outil de manipulation XML. D'autant plus que si tu conseilles PHP 5, autant passer sur SimpleXML qui est plus simple pour un débutant, car apparemment, notre ami est débutant avec XML.

Pour répondre à elerien, il y a un sujet intéressant qui a démarré ici (les 3 premières pages devraient être suffisantes ;-)). Si après avoir lu ça tu ressens le besoin de faire de la POO (Programmation Orientée Objet), alors reviens nous voir, on te donnera des ressources à lire et à travailler.

Posté : 27 juin 2008, 14:17
par elerien
Ok merci... je vais lire tout ça...

Posté : 27 juin 2008, 21:26
par Victor BRITO
Le DOM est avant tout une interface de représentation, plutôt qu'un outil de manipulation XML. D'autant plus que si tu conseilles PHP 5, autant passer sur SimpleXML qui est plus simple pour un débutant, car apparemment, notre ami est débutant avec XML.
SimpleXML est, en effet, une bibliothèque très sympa. Si notre ami est débutant en la matière, il peut essayer de dénicher un script PHP 5 permettant d'afficher un fil RSS (s'il s'agit d'un fil Atom, il peut essayer, par exemple, ce script, qui est basé sur SimpleXML ;) ).

Posté : 30 juin 2008, 09:43
par Invité
SimpleXML est, en effet, une bibliothèque très sympa. Si notre ami est débutant en la matière, il peut essayer de dénicher un script PHP 5 permettant d'afficher un fil RSS (s'il s'agit d'un fil Atom, il peut essayer, par exemple, ce script, qui est basé sur SimpleXML ;) ).
merci.
Je suis sous RSS 2.0. Mais le code que je vous présente est un code que j'ai déniché sur développer.com!! De plus, il me faut un formulaire pour remplir ces flus RSS... Il y en aura certainement un certain nombre.

Faut il tout stocker dans la base de données ou peut on se permettre de stocker dans le fichier SQL... Avantage de la base de données, c'est que l'on va chercher uniquement ce dont on a besoin ( les 10 dernières news, les new pour un catégorie donnée, le news correspondant à un mot clé...).

peut on faire ça avec un simple fichier XML ??

Posté : 30 juin 2008, 12:11
par katagoto
Tout est possible, tout est réalisable, réfléchit tu stock les news une a une dans ta BDD, c'est la plus pratique...

Posté : 30 juin 2008, 14:42
par Invité
en fait je demandais juste si on pouvait aller chercher que les news qui nous interessent si on fait le stockage dans le fichier XML. C'est tout^^

Posté : 30 juin 2008, 14:49
par Hywan
Oui on peut. Mais il va falloir manipuler XPath (et XSLT pour l'affichage).
Je n'ai pas de bons tutoriels sous la main, mais cherche sur Internet, tu vas en trouver un paquet :).