IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Script de recherche pour site dynamique


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 128
    Par défaut [Tableaux] Script de recherche pour site dynamique
    Bonjour à tous,

    voilà j'ai fais un site en php, entre autre il diffuse du contenu dynamique(bdd MySQL) je voudrais y inclure un module de rechercher.

    Espèrant gagné du temps, je me met en quête d'un script php pouvant me faire ça proprement mais je tombe uniquement sur des scripts que parse fichier/dossier donc destiné à du contenu static.

    Est-ce qu'un tel script existe ? sinon comment puis-je optimisé mon code et mes requêtes pour avoir qlq chose de performant ?

    merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 128
    Par défaut
    peut être ne suis je très explicite :
    je voudrait créer/trouver un script de recherche portant sur 2 champ d'une table.

    pour l'instant j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     $cwhere = "";
     $key_word_lst = explode(" ",$_POST['search_field']);
     foreach($key_word_lst as $key_word){
      if($cwhere != ""){
       $cwhere .= " or ";
      }
      $cwhere .= "(article.titre like \"%".$key_word."%\" or article.descr like \"%".$key_word."%\")";
     }
    et à l'affichage je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach($key_word_lst as $key_word){
     $val_art['titre'] = str_replace($key_word,"<b>".$key_word."</b>",$val_art['titre']);
    }
     echo $val_art['titre'];
     
    $extrait = substr($val_art['descr'],0,200);
     
    foreach($key_word_lst as $key_word){
     $extrait = str_replace($key_word,"<b>".$key_word."</b>",$extrait);
    }
     
     echo $extrait;
    mais j'ai un problème :
    - comment trié mon résultat par pertinance (nombre d'occurence des mots clé), doit je me lancé dans le développement d'une usine à gaz ?(si oui qlq conseil sur les voies à emprunté me serais d'une grande aide)

    et un soucis :
    - que peu donnez un tel script(et une tel requête) eau niveau performance lorsque que j'aurais une table très fournis ?

    merci d'avance aux courageux qui se pencherons sur mon pb

  3. #3
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    va jeter un oeil à ce tuto : "Intégrer le moteur google free search"
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  4. #4
    Membre éclairé Avatar de hisy
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 377
    Par défaut
    Je peux te proposer une classe que j'ai développée pour moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    <?php
    /**
     * Class gérant les recheches sur une table
     * @package myClass
     * @author  HiSy
     * @version 1.2 du 05/03/2006
    */
    class Recherche
    {
     /**#@+    
     * Attributs de la classe 
     * @var string
     */ 
     /**
     * Liste des champs de la table ciblés par la recherche
     */
     var $champsCibles;
     /**
     * Liste des mots clés soumis pour recherche .
     */
     var $motsCles;
     /**
     * Operateur de la recherche 
     */
     var $operateur;
     /**
     *  Filtres à passer à la requete en plus des mots clés
     */
     var $filtrePrimaire;
     /**
     * Tri des resultats
     */
     var $orderBy;
     <a href="http://www.developpez.net/forums/" target="_blank">/**#@-*/</a>
     
     /*
     * CONSTRUCTEUR
     *
     * Instancie l'objet avec tous les éléments passés en parametres
     * Lance la coloration
     */
     function Recherche($table,$champsCibles,$champsRetour="*",$motsCles,$operateur,$filtrePrimaire="1=1",$orderBy=null){
      $this->table=is_array($table)?implode(",",$table):$table;
      $this->champsCibles=$champsCibles;
      $this->champsRetour=$champsRetour!=""?(is_array($champsRetour)?implode(',',$champsRetour):$champsRetour):"*";  
      $this->motsCles=$motsCles;
      $this->operateur=$operateur;
      $this->filtrePrimaire=$filtrePrimaire!=""?$filtrePrimaire:"1=1";
      $this->orderBy=$orderBy;
     }
     /*
     * Fonction recherche des mots clés dans les champs cibles
     *
     * Fait appelle à la méthode coloration et applique une coloration aux resultats 
     *
     * @param string $color couleur à appliquer aux mots clés trouvés ( par défaut rouge )
     * @return array $tabLIste tableau associatif prenant pour clés tous les champs de la table 
     */
     function getListeColoration($color="#FF0000") {
      $nbChampsCibles=count($this->champsCibles);
      $nbMotsCles=count($this->motsCles);
      for($i=0;$i< $nbChampsCibles; $i++){
       for($j=0;$j<$nbMotsCles;$j++){
        if($this->operateur=="AND") {
         $operateur=$j==0?") OR (":"AND";
        }
        else {
         $operateur="OR";
        }
        $filtre.=($j==0 && $i==0)?"":$operateur;
        $filtre.=" ".$this->champsCibles[$i]." LIKE '%".$this->motsCles[$j]."%' ";
       }
      }
      print $sql="SELECT ".$this->champsRetour." FROM ".$this->table." WHERE (($filtre)) AND(".$this->filtrePrimaire.")  ".$this->orderBy;
      $res=mysql_query($sql) or die ('Pb dans les parametres de la class Recherche');
      while($liste=mysql_fetch_assoc($res)){
       foreach($liste as $key => $value) {
        $tabLigne[$key]=$this->coloration($value,$this->motsCles,$color);
       }
       $tabListe[]=$tabLigne;
      }
      return $tabListe;
     }
     /*
     * Fonction coloration des mots clés dans un champ
     *
     *@param string $champ champ de la table
     *@param 
     * @param string $color couleur à appliquer aux mots clés trouvés ( par défaut rouge )
     * @param array $motsCles tableau des mots à rechercher
     * @return array $tabLIste tableau associatif prenant pour clés tous les champs de la table 
     */
     function coloration($champ,$motsCles,$color){
      // On elimine les caractères superflus
      while(ereg("  ",$motsCles)) $motsCles=trim(str_replace("  "," ",$motsCles));
     
      $retourStr = ""; // chaine de retour
      $pos = 0;
      $tabChar = array ();
     
      // Traitement
      if ($motsCles != ""){
       $tab =  $motsCles;  // Tableau de mots clés
       $nb = count($tab);  // Nombre de mot clés
       // Si il ya au moins un mot clé
       if ($nb > 0) {
        for($i = 0; $i < $nb; $i++) { // pour chaque motclé
         $pos = strpos(strtolower($champ), strtolower($tab[$i]));
         while(!($pos === false)) {
          for ($iChar = 0; $iChar < strlen($tab[$i]); $iChar++) 
           array_push($tabChar,$pos + $iChar); 
          $pos = $pos + strlen($tab[$i]);
          $pos = strpos(strtolower($champ), strtolower($tab[$i]), $pos);
         }
        }
        for ($iStr = 0; $iStr < strlen($champ); $iStr++) {
         $trouve = false;
         $nbChar = count($tabChar); 
     
         if ($nbChar > 0){
          for($iChar = 0; $iChar < $nbChar; $iChar++) {
           if (array_key_exists($iChar,$tabChar)) {
            if ($tabChar[$iChar] == $iStr) $trouve = true;
           }
          }
         }
         // Je si je trouve je colorie
         if ($trouve) 
          $retourStr .= "<strong><font color=".$color.">".substr($champ, $iStr, 1)."</font></strong>";
         else
          $retourStr .= substr($champ, $iStr, 1);
        }
       }
      }
      else $retourStr=$champ;
      return $retourStr;
     }
    }
    ?>
    Tu l'appelles comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    */
    // Connexion à la base ///
    // .... chaine de connexion ou include d'un fichier
    // Chemin vers la class
    require("recherche.php");
    // QUOI : Mots à rechercher :
    $motsCles=array("DA","DCPM");
    // OU : Table(s) cible(s), champs de cette/ces table(s)
    $table=array('suggestions, users');
    $champsCibles=array('sug_titre','sug_desc','sug_argent','sug_service','sug_temps');
    // TYPE : Recherche en OR ou en AND
    $operateur=isset($_POST['operateur'])?$_POST['operateur']:"OR";
    // RETOUR : champs à retourner dans le tableau associatif, la valeur par défaut est *
    $champsRetour=array('sug_nom_prenom', 'user_nom_prenom');
    // FILTRES : permet de d'ajouter des fitlres autres que les mots clés à la requete et/ou pour une jointure éventuelle
    $filtrePrimaire="sug_nom_prenom=user_nom_prenom";
    // TRI :
    $orderBy="";
    // J'instancie mon Objet
    $recherche=new Recherche($table,$champsCibles,$champsRetour,$motsCles,$operateur,$filtrePrimaire,$orderBy);
    // je récupere le resultat coloré
    $tabListe=$recherche->getListeColoration();
    // Pour test ...
    print_r($tabListe);

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 128
    Par défaut
    c'est gentil de m'épauler les gars

    @titoumimi : g survolé très vite ton lien, il me semble que c pour des site static ou générant un cache serveur

    @hisy : merci bcp cela semble correspondre à ce que j'ai besoin

    mais g qlq question pour l'adaptation

    1) peu tu me filé des exemples ou mexplique plus en détails l'utilisation de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // FILTRES : permet de d'ajouter des fitlres autres que les mots clés à la requete et/ou pour une jointure éventuelle
    $filtrePrimaire="";
    2) j'ai une clause "LEFT JOIN" que je doit implémenter dans cette recherche, doit je le mettre en dur dans la classe ?(question surment en relation avec la 1)

    3) je souhaiterais ajouté une colone au tableau de retour avec le nb d'occurence trouvé, je serais tenté d'incrémenté ce nb pdt la colorisatrion.En faite ça fais 2 - 3 fois que je lit ta classe et je vois pas encore trop comment y parvenir, si tu peu m'aiguillé plz sinon c'est pas grave je trouverais

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 128
    Par défaut
    pour clarifié le pt 3 de mon précédent post :

    ta classe retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Array([0] => Array(
    [nomduchampsélectionné1]=> valeurduchampsélectionné1 
    [nomduchampsélectionné2]=> valeurduchampsélectionné2 ...etc...))
    je souhaiterais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Array([0,0] => Array(
    [nomduchampsélectionné1]=> valeurduchampsélectionné1 
    [nomduchampsélectionné2]=> valeurduchampsélectionné2 ...etc...)
    [0,1]=>nombredoccurencedesmotsclé
    [1,0] => Array(
    [nomduchampsélectionné1]=> valeurduchampsélectionné1 
    [nomduchampsélectionné2]=> valeurduchampsélectionné2 ...etc...)
    [1,1]=>nombredoccurencedesmotsclé ...etc...)
    ceci afin d'effectué un trie par nombre d'occurence des résultat.

    est-ce possible de l'addapté en ce sens celon toi ? si oui, g pas encore trouvé ^^ chui pas un as des tableau et de la POO faut dire

Discussions similaires

  1. Quels langage et plateforme dois-je choisir pour site dynamique d'école
    Par sabrineisimm dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 24/09/2011, 10h55
  2. sitemap automatique pour site dynamique
    Par Mister Nono dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2011, 14h18
  3. Réponses: 0
    Dernier message: 30/11/2008, 11h42
  4. Moteur de recherche pour site web
    Par M1000 dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 11/04/2008, 12h10
  5. [MySQL] Script de recherche pour un forum (ou même tout un site)
    Par Jonathan.b dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/01/2008, 08h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo