Forum Clubic

Rechercher un mot dans une balise description XML ?

Bonjour,

Je suis debutant en php, en simpleXML et en SQlite !

J’ai trouver un chouette modèle d’agregateur (www.ASP-PHP.net) de plusieurs flux XML dans une base de donnée SQlite qui me permet après une récupération sous forme exploitable.

Voila un exemple : rsslist.php5

j’aimerai que la base de données réalisée ou que la page d’affichage ne traite que les items XML dont la balise description contient une année précise (par ex:2007) puisque je n’ai pas d’information de date valable, je ne peu me baser sur un pubdate.

Il faut donc que je sache comment faire une recherche d’un mot dans le contenu text d’une balise XML contenue dans une base SQlite ?
Quel commande puis je utilisée ? PHP, SQlite, …

Une partie du code si necessaire

Merci d’avance


?php

// Connexion/création de la base
$db = @sqlite_open($db_path) or die("Impossible de créer la base !");

// Génération des tables
@sqlite_query($db,"CREATE TABLE flux(
   ID INTEGER PRIMARY KEY,
   titre varchar(50),
   url varchar(255),
   rubrique varchar(20),
   maj INTEGER
)");
@sqlite_query($db,"CREATE TABLE item(
   ID INTEGER PRIMARY KEY,
   IDflux INTEGER,
   titre varchar(50),
   lien varchar(255),
   pubdate INTEGER,
   description TEXT
)");

// SQLite n'aime pas les ' :s
function sql($txt) { return str_replace("'","’",$txt); }

// 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));
}

// Mise à jour de la base
function lit_rss($url) {
   global $db;
   // Récupération de l'ID du flux
   $result = sqlite_query($db,"SELECT ID FROM flux WHERE url='".$url."'");
   $id = sqlite_fetch_single($result);
   // Lecture du flux
   if($flux=simplexml_load_file($url)) {
      $flux = $flux->channel;
      $titre = $flux->title;
      // Mise à jour du flux
      sqlite_query($db,"UPDATE flux SET titre='".sql($titre)."',maj=".time()." WHERE ID=".$id);
      // Pour chaque <item>
      foreach($flux->item as $item) {
         // On récupère les champs
         $date = strtotime($item->pubDate); if(!$date) $date=time();
         $titre = $item->title;
         $lien = $item->link;
         $desc = $item->description; 
         // Anti-doublon sur URL
         $result = sqlite_query($db,"SELECT ID FROM item WHERE lien='".$lien."' AND IDflux=".$id);
         // Mise à jour
         if(sqlite_num_rows($result)>0) {
            sqlite_query($db,"UPDATE item SET titre='".sql($titre)."',description='".sql($desc)
               ."' WHERE ID=".sqlite_fetch_single($result));
         // ou ajout à la BD
         } else {
            sqlite_query($db,"INSERT INTO item(IDflux,titre,lien,pubdate,description) 
               VALUES(".$id.",'".sql($titre)."','".$lien."',".$date.",'".sql($desc)."')");
         }
      }
   }
}

update();

?> 

Merci de votre aide

Simple requête SQL :

… WHERE description LIKE ‘%". $desc . "%’ …

En gros, tu utilises l’opérateur LIKE

Ok

donc si j’etabli qu’il me faut tous les RSS de 2007 et plus , je dois déterminer une variable

$an >= 2007

en debut de code et puis mettre cela dans la ligne que vous proposé (voit pas trop comment…) … et mettre cette ligne ou ?

// Mise à jour de la base
function lit_rss($url) {
 global $db;
 // Récupération de l'ID du flux
 $result = sqlite_query($db,"SELECT ID FROM flux WHERE url='".$url."'");
 $id = sqlite_fetch_single($result);
 // Lecture du flux
 if($flux=simplexml_load_file($url)) {
 $flux = $flux->channel;
 $titre = $flux->title;
 // Mise à jour du flux
 sqlite_query($db,"UPDATE flux SET titre='".sql($titre)."',maj=".time()." WHERE ID=".$id);
 // Pour chaque <item>
 foreach($flux->item as $item) {
 // On récupère les champs
 $date = strtotime($item->pubDate); if(!$date) $date=time();
 $titre = $item->title;
 $lien = $item->link;
 $desc = $item->description; 
 // Anti-doublon sur URL
 $result = sqlite_query($db,"SELECT ID FROM item WHERE lien='".$lien."' AND IDflux=".$id);
 // Mise à jour
 if(sqlite_num_rows($result)>0) {
 sqlite_query($db,"UPDATE item SET titre='".sql($titre)."',description='".sql($desc)
 ."' WHERE ID=".sqlite_fetch_single($result));
 // ou ajout à la BD
 } else {
 sqlite_query($db,"INSERT INTO item(IDflux,titre,lien,pubdate,description) 
 VALUES(".$id.",'".sql($titre)."','".$lien."',".$date.",'".sql($desc)."')");
 }
 }
 }
}

Merci d’avance, je debute et c’est pas facile.

Je sais pas trop où, mais là peut-être:

sqlite_query($db,“UPDATE item SET titre=’”.sql($titre)."’,description LIKE ‘%".sql($desc)
."%’ WHERE ID=".sqlite_fetch_single($result));
// ou ajout à la BD

Oki, je vais essayer, Mais je mets ou la valeur recherchée ? (2007)

à priori, dans ta variable $desc.

Maintenant ce n’est peut -être pas le bon endroit, à voir.

Ben voila, j’ai essayer pas mal de chose et ça marche pas. Je n’écrit peut être pas le code convenablement.

J’ai essayer en utilisant une variable $an = 2007 et avec directement la variable ‘2007’ .

Avec la fonction WHERE … LIKE …

J’ai aussi essayer en en version DELETE …WHERE … LIKE … juste avant l’anti doublon


$result = sqlite_query($db,"DELETE ID FROM item WHERE description LIKE '2007'");
// Anti-doublon sur URL
 $result = sqlite_query($db,"SELECT ID FROM item WHERE lien='".$lien."' AND IDflux=".$id);

Mais tous ce que j’essaye ne marche pas.

Et directement a la demande d’affichage, ca serai pas plus facile ?
Voici le code

<?
      // AFFICHAGE DES NEWS
      $deb = @$_GET["deb"]; if(!$deb) $deb=0;
      $SQL = " FROM item INNER JOIN flux ON item.IDflux=flux.ID";
      $lien = "";

      // sélection de news
      if(@$_GET["rubrique"]) {
         $SQL .= " AND flux.rubrique='".$_GET["rubrique"]."'";
         $lien .= "&rubrique=".urlencode($_GET["rubrique"]);
      }
      if(@$_GET["flux"]) {
         $SQL .= " AND flux.ID=".$_GET["flux"];
         $lien .= "&flux=".urlencode($_GET["flux"]);
      }

         // Sélection des news
      $SQL = "SELECT flux.url as url,item.titre as titre,item.pubdate as pubdate,item.lien as lien,
         item.ID as ID,item.description as description"
         .$SQL." ORDER BY pubdate DESC LIMIT ".$deb.",".$maxperpage;

      // et zou... lecture
      $result = sqlite_query($db,$SQL);
      echo "<dl>"; $temp="";

      // Pour chaque news
      while($val=sqlite_fetch_array($result)) {
     
                     
         // affiche la news
         echo "<dd>
            <i>".date("d/m/Y",$val["pubdate"])."</i>
            <A ";
   
            // lien vers le site
            echo "target='_blank' href='".$val["lien"];
            echo "'>".utf8_decode($val["titre"])."</A>";
            echo "<br>          <i>".utf8_decode($val["description"])."</i></dd>";
      }
      echo "</dl>";
      echo $pagine;
      ?>