Bonjour,
J'ai écrit un script qui me permet de rentrer les informations d'un flux RSS dans une base de donnée. Le problème est que je ne sais pas gérer les doublons, à chaque fois que j'actualise m'a page, toutes les actualités sont à nouveau entrés.
Voici le code :
<?php
try{
if(!@$fluxrss=simplexml_load_file('http://www.alsacreations.com/rss/actualites.xml')){
throw new Exception('Flux introuvable');
}
if(empty($fluxrss->channel->title) || empty($fluxrss->channel->item->title))
throw new Exception('Flux invalide');
$i = 0;
$arreter = 10;
foreach($fluxrss->channel->item as $item){
/*Les Varialbles*/
$site = 'Alsacréation.fr';
$link = (string)$item->link;
$title= (string)$item->title;
$author= (string)$item->author;
$date = date('Y-m-d H:i',strtotime($item->pubDate));
/*Requetter*/
$req = $bdd->prepare(
'INSERT INTO matable(
site,
title,
link,
pubdate,
author)
VALUES(
:site,
:title,
:link,
:pubdate,
:author)'
);
$req->execute(array(
'site' => $site,
'title'=> $title,
'link' => $link,
'pubdate' => $date,
'author' => $author
));
$i++;
if($i>$arreter)
break;
}
}
catch(Exception $e){
echo $e->getMessage();
}
?>
Merci pour votre aide.
Je ferme.
J'ai fait un hash sur le liens, que je met en unique sur ma base de donnée.
Et tout fonctionne.
Salut,
Tu peux essayer avec la fonction count() en te basant sur l'url, c'est ce qui me parait le plus logique pour tester un doublon.
En gros tu fais :
if(count($bdd->query("SELECT * FROM ta_table WHERE link = 'ton lien à tester' ")) === 0){
Ta commande...
}
En fait, il va exécuter la commande uniquement si il ne trouve pas déjà d'entrée comportant ce lien.
Je n'ai pas testé mais à priori ça devrait fonctionner, tiens nous au courant. :)
Merci pour ta réponse.
Maintenant il ne me rentre plus rien dans la base quand je charge la page.
try{
if(!@$fluxrss=simplexml_load_file($tab$z]'flux'])){
throw new Exception('Flux introuvable');
}
if(empty($fluxrss->channel->title) || empty($fluxrss->channel->item->title))
throw new Exception('Flux invalide');
$i = 0;
$arreter = 10;
foreach($fluxrss->channel->item as $item){
/*Les Varialbles*/
$site = $tab$z]'nom'];
$link = (string)$item->link;
$title= (string)$item->title;
$author= (string)$item->author;
$date = date('Y-m-d H:i',strtotime($item->pubDate));
if(count($bdd->query("SELECT * FROM ma_table WHERE link = '$link' ")) == 0){
/*Requetter*/
$req = $bdd->prepare(
'INSERT INTO evect(
site,
title,
link,
pubdate,
author)
VALUES(
:site,
:title,
:link,
:pubdate,
:author)'
);
$req->execute(array(
'site' => $site,
'title'=> $title,
'link' => $link,
'pubdate' => $date,
'author' => $author
));
$i++;
if($i>$arreter)
break;
}
}
}
catch(Exception $e){
echo $e->getMessage();
}
C'est à dire plus rien ? Si il n'y a pas d'entrées nouvelles dans le flux RSS c'est que ça marche.
Sinon, je vois pas, tout m'a l'air correct.
Il n'y a pas d'erreur ?
Si jamais, avant ton if(count...) essaye de faire un
var_dump($bdd->query("SELECT * FROM ma_table WHERE link = '$link' "));
pour voir si la commande est correcte et retourne des résultats
Il n'y a plus rien dans le sens ou plus aucune actualité ne s'enregistre dans la BDD, même les nouvelles.
Ta variable $link, c'est bien l'adresse de l'article récupéré par le flux RSS ? J'en ai déduit ça mais si ça se trouve je me trompe.
Oui exactement, je te met le code complet en cas ou j'aurais fait une erreur :
<?php
// Récupération des site
$compteur = 0;
$n=0;
$tab = array();
// Récupération des site enregister dans la BDD
$site = $bdd->query('SELECT * FROM site LIMIT 0,5');
while($info = $site->fetch())
{
$tab$n]'flux']= $info'flux'];
$tab$n]'nom']= $info'nom'];
$n++;
}
$site->closeCursor();
$z=0;
for($z=0;$z<sizeof($tab);$z++)
{
try{
/*Récupération des données du flux XML*/
if(!@$fluxrss=simplexml_load_file($tab$z]'flux'])){
throw new Exception('Flux introuvable');
}
// Vérification du flux XML
if(empty($fluxrss->channel->title) || empty($fluxrss->channel->item->title))
throw new Exception('Flux invalide');
$i = 0;
$arreter = 10;
foreach($fluxrss->channel->item as $item)
{
/*Assignation des Varialbles*/
$site = $tab$z]'nom'];
$link = (string)$item->link;
$title= (string)$item->title;
$author= (string)$item->author;
$date = date('Y-m-d H:i',strtotime($item->pubDate));
/*Vérification*/
if(count($bdd->query("SELECT * FROM evect WHERE link = '$link' ")) == 0)
{
/*Requette*/
$req = $bdd->prepare(
'INSERT INTO evect(
site,
title,
link,
pubdate,
author)
VALUES(
:site,
:title,
:link,
:pubdate,
:author)'
);
$req->execute(array(
'site' => $site,
'title'=> $title,
'link' => $link,
'pubdate' => $date,
'author' => $author
));
}
$i++;
if($i>$arreter)
break;
}
}
catch(Exception $e){
echo $e->getMessage();
}
}
/*Afficher le resultat*/
$reponse = $bdd->query('SELECT * FROM evect ORDER BY pubdate DESC LIMIT 0,500') or die(print_r($bdd->errorInfo()));
while($donnees = $reponse->fetch()) {
echo stripslashes($donnees'title']).'<br/> Le '.stripslashes($donnees'pubdate']).'<br/><br/>';
}
$reponse->closeCursor();
?>
Ha bah oui ^^
Je pense que ça vient de ton $arrêter, en l'état, il fait bien la vérification mais stop au bout de 10, même si les 10 existent déjà dans la base.
Remonte juste ton
$i++;
if($i>$arreter)
break;
à l'intérieur de ta condition et ça devrait fonctionner. :)
Sa ne fonctionne pas. :/
Puis le $arrêter s'applique sur le foreach, donc je pense pas qu'il doit être dans la condition.