Vérification doublon dans base de donnée

Par passealasuite, il y a 13 ans


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.

10 réponses

Natà, il y a 13 ans

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. :)

passealasuite, il y a 13 ans

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();
                }
Natà, il y a 13 ans

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

passealasuite, il y a 13 ans

Il n'y a plus rien dans le sens ou plus aucune actualité ne s'enregistre dans la BDD, même les nouvelles.

Natà, il y a 13 ans

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.

passealasuite, il y a 13 ans

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();

        ?>
Natà, il y a 13 ans

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. :)

passealasuite, il y a 13 ans

Sa ne fonctionne pas. :/
Puis le $arrêter s'applique sur le foreach, donc je pense pas qu'il doit être dans la condition.

Natà, il y a 13 ans

Alors, la je pense que je vais passer mon tour, je ne comprend pas, désolé. :/

passealasuite, il y a 13 ans

Je ferme.

J'ai fait un hash sur le liens, que je met en unique sur ma base de donnée.

Et tout fonctionne.