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

PHP & Base de données Discussion :

Personnaliser un moteur de recherche interne [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 45
    Par défaut Personnaliser un moteur de recherche interne
    Bonjour,

    je suis en train de réaliser un moteur de recherche interne de mon site web avec base de donnée et table (id, titre, description, mots-clés, url, priorité, etc...) mais je rencontre un petit problème pour personnaliser son moteur de recherche interne.

    Je souhaite pour une série de 3 requêtes, une pour rerchercher l'expression exacte, une pour rechercher les mots 1 par 1, une pour rechercher à l'intérieur de chaque mot s'il peut y'avoir des similitudes...

    Sauf qu'avec ce que j'ai créé, certes je n'ai pas de bugs, mais je n'ai pas les résultats souhaités, ça ne fonctionne pas comme ça devrait.

    Est-ce que quelqu'un peut m'aider à peaufiner les requêtes pour qu'elle ressemble à celle qu'elle devrais être ???


    1/ La première requête doit rechercher l'expression exacte entrée dans le formulaire. Exemple, recherche de "pizzas napolitaines", ça doit rechercher "pizzas napolitaines". En principe, ce que j'ai doit être bon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from recherche where recherche_motscles LIKE '%$_POST[text]%' ORDER BY recherche_priority DESC
    2/ La seconde requête doit rechercher les mots 1 par 1 entrés dans le formulaire. Exemple, pour une recherche de "pizzas napolitaines", ça doit rechercher "pizzas" OR "napolitaines". Donc ce que j'ai ci-dessous n'ai pas bon, mais comment résoudre ça ? Que faire pour que ça corresponde à la bonne requête ? Découper $i ? Est-ce suffisant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $query="SELECT * FROM recherche WHERE ";
    for($i=0;$i<sizeof($array_chaine);$i++){
    if(strlen($array_chaine[$i])>3){
    if($i>0){$query.=" OR ";}
    $query.="recherche_motscles = '$array_chaine[$i]'";
    }
    }
    $query.= " ORDER BY recherche_priority DESC ";
    3/ La troisième requête doit rechercher entre les mots, les découper pour mieux les analysés. Exemple, pour une recherche de "pizzas napolitaines", ça doit rechercher tous les mots qui commence par "pi" ou "piz" ou "pizz" et pareil pour "nap" ou "napo" etc... etc... Quelque chose de similaire... J'ai au final ceci, mais est-ce vraiment le plus pertinant pour correspondre une fois encore à la requête demandée ??? Ou est-ce que ça n'a pas vraiment de rapport ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $query="SELECT * FROM recherche WHERE ";
    for($i=0;$i<sizeof($array_chaine);$i++){
    if(strlen($array_chaine[$i])>3){
    if($i>0){$query.=" OR ";}
    $query.="recherche_motscles LIKE '%$array_chaine[$i]%'";
    }
    }
    $query.= " ORDER BY recherche_priority DESC ";
    Voilà, si quelqu'un peut m'aider à mieux développer tout ça, faire un truc bien précis, ce serait franchement sympa... Merci d'avance!

    a+

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    pour plus de performance/commodité je te conseille de passer en recherche FULL-TEXT

    Sinon pour 1 : effectivement apparemment c'est bon.
    Pour 2, un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $query="SELECT * FROM recherche WHERE ";
    for($i = 0, $nbMots = count($array_chaine); $i < $nbMots; $i++) {
    $tmpRech[] = "recherche_motscles LIKE '%".$array_chaine[$i]."%'";
    }
    $query .= implode(' OR ', $tmpRech);
    Pour 3 : Ca dépend de ce que tu veux, tu peux choisir un nombre de caractères par exemple 2 et ca te donne un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $query="SELECT * FROM recherche WHERE ";
    for($i = 0, $nbMots = count($array_chaine); $i < $nbMots; $i++) {
    $tmpRech[] = "recherche_motscles LIKE '".substr($array_chaine[$i],0,2)."%'";
    }
    $query .= implode(' OR ', $tmpRech);
    Ou tu peux t'orienter vers de la recherche soundex plus compliqué surtout en langue française mais y a pas mal de tutos sur le net.

    Bye

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 45
    Par défaut
    Merci des conseils, finalement je suis passé en recherche FULL-TEXT, c'est effectivement plus performant, mais je rencontre un autre problème, quand je fais une recherche d'un mot et qu'il y a plusieurs pages de résultats...

    Sur la première page de résultats, tout s'affiche normalement, les résultats dans l'ordre, avec en dessous "Page précèdente - 1 2 3 ... - Page suivante" etc...

    Mais si je clique sur une autre page de recherche (ex: "Page suivante"), je tombe sur la partie "Il y a 0 résultat", hors il devrait s'afficher les résultats suivants par rapport à cette recherche. Ma requête me semble pourtant claire et l'affichage par par page également... Que faire ?

    Quelqu'un pour m'aider ??? Comment éviter tout ces bugs au niveau des pages suivantes/précèdentes ??? Ai-je fais une erreur ou un oubli quelque part ???

    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
    ...
     
    $page = isset($_GET['page']) ? $_GET['page'] : '';
     
    $requete = "SELECT * FROM recherche WHERE MATCH (recherche_titre, recherche_description, recherche_page, recherche_motscles) AGAINST ('".$_POST["text"]."' IN BOOLEAN MODE)";
    $req = mysql_query($requete);
     
    $limit=7;
    if($debut==""){$debut=0;}
    $debut=$page*$limit;
     
    $res= mysql_num_rows($req);
    $limite=mysql_query("$requete limit $debut,$limit");
     
    if ($res>0) { 
    echo '<font class="mini"><font class="gris">Recherche - Il y a '.$res.' résultat(s) pour : '.$_POST["text"].'</font></font><br><hr><br>';
     
    $limit_str = "LIMIT ". $page * $limit .",$limit";
    $result = mysql_query("SELECT * FROM recherche WHERE MATCH (recherche_titre, recherche_description, recherche_page, recherche_motscles) AGAINST ('".$_POST["text"]."' IN BOOLEAN MODE) $limit_str");
    while( $sortie = mysql_fetch_array($result))
    {
    $url = $sortie['recherche_url']; 
    echo '<font size="3" color="#678BB8"><a href="'.$sortie['recherche_url'].'"><u>'.$sortie['recherche_titre'].'</u></a></font><br / >';
    echo $sortie['recherche_description'].'<br /><br />';
    echo '<a href="'.$sortie['recherche_url'].'"><img src="images/picto-noir.gif"> '.substr($url, 0, 65).'</a><br /><hr><br />';
    }
     
    echo '<br \>Pages : ';
    if ($page>0) {
    $precedent=$page-1;
    echo "<b><a href=\"$PHP_SELF?page=$precedent\">Précèdente</a></b> ";
    }
    $i=0;
    $j=1;
    if($res>$limit) {
    while($i<($res/$limit)) {
    if($i!=$page){echo " <a href=\"$PHP_SELF?page=$i\">$j</a> | ";}
    else { echo "<b>$j |</b>";}
    $i++;$j++;
    }
    }
    if($debut+$limit<$res) {
    $suivant=$page+1;
    echo " <b><a href=\"$PHP_SELF?page=$suivant\">Suivante</a></b>";
    }
    }
     
    else { 
    echo '<font class="mini"><font class="gris">Recherche - Il y a 0 résultat pour : '.$_POST["text"].'</font></font><br><hr><br>';
    echo '<font class="letter">V</font>euillez reformuler votre recherche plus clairement, il n\'y a aucun résultat pour cette recherche.<br><br>';
    }
     
     
    mysql_close();
    ?>

    Merci. Cordialement,

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Vos variables POST sont perdues puisqu'elles ne sont valables que lors de l'appel qui réceptionne les valeurs postées. Utilisez les sessions (plus propre : transparent pour l'utilisateur) ou arrangez-vous pour les retransmettre.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 45
    Par défaut
    Bonjour,

    sauf que dans mon cas, je ne souhaite pas transmettre une variable ou une session de page en page, mais c'est la même page qui se réactualise en prenant en compte l'affichage page par page, et c'est ce qui créé le bug.

    J'ai essayé de retransmettre la variable, mais je n'y suis pas arrivé, le code ne doit pas marché je ne sais pas, je ne vois pas où/quoi modifier pour arriver à un résultat pertinent.

    J'ai tenté l'utilisation d'une session, mais le problème reste le même car la page se réactualise avec au début soit "session_start..." soit "$_POST" ="0" ou "rien", car ça ne garde pas ma précèdente variable...

    Je ne sais pas si je m'exprime bien ou si vous comprenez le problème ??? C'est la réactualisation de la page qui occasionne le problème car ca reprend systématiquement une nouvelle donnée qui est bien évidement vide.

    Que faire ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    La question est abordée toutes les semaines ou presque, une recherche devrait donc vous donnez assez facilement du code montrant la technique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    session_start();
     
    if (isset($_POST['critere'])) {
        $critere = $_SESSION['critere'] = $_POST['critere'];
    } else if (isset($_SESSION['critere'])) {
        $critere = $_SESSION['critere'];
    } else {
        // Aucun critère de recherche : doit-on tous les chercher ou mettre fin au script ?
    }
     
    // Vous effectuez votre requête/recherche en utilisant $critere dans votre clause WHERE (veillez à protéger les données à l'aide de la fonction mysql_real_escape_string)
    Attention si register_globals est à On (cf phpinfo), vous allez avoir des surprises !

    Ce n'est que le principe on peut aller un peu plus loin ...

  7. #7
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 45
    Par défaut
    Merci beaucoup j'ai réussi à éviter ce problème...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Moteur de recherche interne sans pubs
    Par oc_alex86 dans le forum Services
    Réponses: 5
    Dernier message: 29/01/2008, 04h10
  2. Moteur de recherche interne
    Par wasim dans le forum Services
    Réponses: 2
    Dernier message: 23/09/2007, 01h02
  3. [Tableaux] Moteur de recherche interne
    Par mchev dans le forum Langage
    Réponses: 3
    Dernier message: 01/02/2007, 01h20
  4. Moteur de recherche interne avec zope/python
    Par tunix dans le forum Zope
    Réponses: 3
    Dernier message: 01/05/2006, 15h45
  5. Un moteur de recherche interne
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/02/2005, 18h47

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