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

  1. #1
    Membre du Club
    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
    Points : 67
    Points
    67
    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
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut
    salut


    voici un exemple de script permettant de faire une recherche.
    Par contre ce n'est pas moi qui l'ai developpé


    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
     
     
     
    <?
     
    require_once ("../Config/bddconfig.inc.php");
     
    function nb_pages($order,$NBR_CV) 
    {
        $result = MOTEUR_RECH($_POST['text_Demande'], $_POST['button_choix']);
     
        if(mysql_num_rows($result)==0) echo "<center><b>Pas de Résultat</b></center>"; //si il n'y a pas de résultats
        else
        {
            $NB_RSLT = mysql_num_rows($result);
     
            if ($order=="")$order="4";    
     
            $nb_page =  intval($NB_RSLT/$NBR_CV);
     
            for ($i = 1; $i <= $nb_page+1; $i++)
            {
                if ($i != 1) echo " - ";
            ?>
                <a href="Affiche_CV_Recherche.php?order=<? echo $order ?>&page=<? echo $i ?>"><? echo $i ?></a>
            <?  
            }
        }
    } 
     
     
    function MOTEUR_RECH($recherche, $operateur)
    {    
        $recherche=strtolower($recherche);                         // on passe les mots recherchés en minuscules   
        $mots = str_replace("+", " ", trim($recherche));        // on remplace les + par des espaces
        $mots = str_replace("\"", " ", $mots);                  // on remplace les " par des espaces
        $mots = str_replace(",", " ", $mots);                   // on remplace les , par des espaces
        $mots = str_replace(":", " ", $mots);                   // on remplace les : par des espaces
        $tab=explode(" " , $mots);                              // on place les differents mots dans un tableau
        $nb=count($tab);                                        // on compte le nbr d'élément du tableau.
     
     
        if ($order=="")$order="4";
        if ($page=="")$page="1";
     
        switch($order)
        {
            case "1":
                $choix = "tb_indep.Ind_REF";
                break;
     
            case "2":
                $choix = "tb_cv.CV_Titre";
                break;
     
            case "3":
                $choix = "tb_cv.CV_Comp";
                break;
     
            case "4":
                $choix = "tb_indep.Ind_MAJ DESC";
                break;
     
            $choix = "tb_indep.Ind_REF";
            break;
        }    
     
     
        $sql = "    SELECT tb_indep.Ind_REF, tb_cv.CV_Titre, tb_cv.CV_Comp, tb_indep.Ind_MAJ, tb_cv.CV_EL
                    FROM tb_indep INNER JOIN tb_cv ON tb_indep.Ind_Id = tb_cv.Ind_Id 
                    WHERE CV_Comp LIKE \"%$tab[0]%\" ";   //on prépare la requête SQL.;
     
        $sql = "    SELECT DISTINCT
                        tb_indep.Ind_REF, 
                        tb_cv.CV_Titre, 
                        tb_cv.CV_Comp, 
                        tb_indep.Ind_MAJ, 
                        tb_cv.CV_EL
                    FROM 
                        tb_cv
                        INNER JOIN tb_exp ON (tb_cv.CV_Id = tb_exp.CV_Id)
                        INNER JOIN tb_indep ON (tb_cv.Ind_Id = tb_indep.Ind_Id)                     
                    WHERE 
                        tb_cv.CV_Comp LIKE \"%$tab[0]%\" OR 
                        tb_exp.Exp_Mot_Clef LIKE \"%$tab[0]%\" "; 
     
     
        for($i=1 ; $i<$nb; $i++)
        {
            $sql.="$operateur CV_Comp  LIKE  \"%$tab[$i]%\" ";       // on boucle pour integrer tous les mots dans la requête
        }
     
        $sql.= " AND tb_cv.CV_EL = 1 ORDER BY " . $choix ;
     
        //echo $sql."<br>";
     
        $result = mysql_query($sql);                            // on execute la requête SQL.
        //$Enr = mysql_num_rows($result);
     
        return ($result);
    }
     
    function AFF_RSLT()
    {
     
        $result = MOTEUR_RECH($_POST['text_Demande'], $_POST['button_choix']);
     
        if($result)
        {
            if(mysql_num_rows($result)!=0) //si il n'y a pas de résultats
            {
                while($row = mysql_fetch_array($result))
                {
                    $Ref = nl2br($row["Ind_REF"]);
                    $Titre = nl2br($row["CV_Titre"]);
                    $Competences=nl2br($row["CV_Comp"]);
                    $MAJ=nl2br($row["Ind_MAJ"]);
     
                    ?>
                    <tr> 
                        <td width="15%"><div align="center"><font size="3" face="Arial, Helvetica, sans-serif"><a href="Consult_CV.php?REF_CV=<? echo $Ref ?>"><? echo $Ref ?></a></font></div></td>
                        <td width="25%"><div align="center"><font size="3" face="Arial, Helvetica, sans-serif"><? echo $Titre ?></font></div></td>
                        <td width="45%"><div align="center"><font size="3" face="Arial, Helvetica, sans-serif"><? echo $Competences?></font></div></td>
                        <td width="15%"><div align="center"><font size="3" face="Arial, Helvetica, sans-serif"><? echo $MAJ ?></strong></font></div></td>
                      </tr>
                <?
                }
                mysql_free_result($result);
            }
        }
    }
    ?>

    j'espere que cela pourra t'aider

  3. #3
    Membre du Club
    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
    Points : 67
    Points
    67
    Par défaut
    Merci de te penché sur mon pb

    malheureusement je ne pense pas reprendre ton script pour plusieur raison :
    - le trie de la selection se fait sur un champs, je voudrait la trié par le nb d'occurance(à la google ^^)

    - je ne le comprend pas sur plusieur point pk définir $sql deux fois à la suite; pk rechercher tb_exp.Exp_Mot_Clef uniquement sur le premier mots clé($tab[0]); que contient $_POST['button_choix'] je suppose 'and' ou 'or'

    - j'ai déjà pondut qlq chose qui fait pareil ou presque ^^

    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."%\")";
     }
    en tout cas merci bien car tu est le seul pour l'insant à avoir osé bravé mon problème que je croyait pourtant simple ou du moins banal au vu du nb de site proposant ce genre de module

  4. #4
    Membre du Club
    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
    Points : 67
    Points
    67
    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

  5. #5
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    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

  6. #6
    Membre averti 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
    Points : 353
    Points
    353
    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);
    Take it HiSy

  7. #7
    Membre du Club
    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
    Points : 67
    Points
    67
    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

  8. #8
    Membre du Club
    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
    Points : 67
    Points
    67
    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