Pb résultats moteur de recherche

Mammouth du PHP | 620 Messages

13 oct. 2009, 17:15

Bonjour,

pour mon site de photos j'ai créé un petit moteur de recherche qui se base sur le nom et la description lié au photos.
le moteur de recherche fonctionne bien mais je me trouve confronté a des problemes avec les majuscules et le accents.

Probleme n°1 : le plus important et le plus urgent
Par exemple dans ma base de données j'ai des photos qui sont nommées en majuscule " ex : SAINT AME". si je fais une recherche sur "SAINT AME" j'ai 0 resultats et idem si je fais la recherche en minuscule. pour un nom standart (ex : vagney ) si je recherhce vagney alors j'ai bien les bons resultats qui sortent.

Probleme n°2 : les accents (qui n'est pas prioritaire mai j'y reviendrai par la suite apres avoir reglé le probleme 1)
Si j'ai des noms de photos avec par exemple "gérardmer" et que dans ma recherche je rentre "gérardmer" les bon resultats ressortent par contre si je rentre "gerardmer" sans l'accent j'ai 0 resultats qui sortent.


Voici comment est fait mon moteur de recherche :

page formulaire :
<div id="recherche">
    <form  name="formulaire" action="../recherche/search.php" method="POST" id="q">
      <div class="rechselect">
        <label>rechercher dans&nbsp; </label> 
        <select name="rechercherpar">
          <option>Toutes les galeries</option>
            <?php
            $sql = "SELECT DISTINCT type FROM IWgalerie"; // requéte SQL   
            $req = mysql_query($sql) or die('<u>Probleme SQL</u> : '.$sql.'<br>'.mysql_error());  // envoie de la requéte 
            while($resultat = mysql_fetch_array($req))   
            {
            echo '<option>'.$resultat['type'].'</option>';
            }
            ?>
        </select>
      </div>
          
        <div class="rechmot">
            <input name="mot_cle" type="text" id="mot_cle" onfocus="if(this.value=='Précisez votre recherche')this.value='';" onblur="if(this.value=='')this.value='Précisez votre recherche';" value="Précisez votre recherche"/> 
            <input type="submit" value=" "/>
      </div>
    </form>
</div>
et ma page qui valide et donne le resultat de la recherche :
<?php

function search()
          {
$champ=$_POST['rechercherpar'];
$mot=$_POST['mot_cle'];

echo '<img src="../images/fleche.png" alt="Les photos trouvées" class="imggauche" />
Vous rechercher portait sur : <span class="surljaune"> '.$mot.' </span> <br/>Pour le type de galerie : <span class="surljaune"> '.$champ. ' </span><br/>Voici les photos trouvées en fonction de votre recherche.<div class="clear"></div>'; 

if($champ == 'Toutes les galeries' )
{
$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(`ref`,`exemple`,`alt`) against ('$mot') ORDER BY type, ref, alt  ASC");
}
elseif($champ != 'Toutes les galeries' ){
$resultat=mysql_query("SELECT * FROM IWgalerie WHERE type='$champ' AND match(`ref`,`exemple`,`alt`) against ('$mot') ORDER BY type ASC");
}

   while($ligne = mysql_fetch_array($resultat))
          {
   $ref=$ligne['ref'];
   $alt=$ligne['alt'];
   $type=$ligne['type'];
   
 echo '<div class="search"><h4>'.$type.'</h4>
 
 <a href="../images/galerie/'.$ligne['photoref'].'" rel="lightbox[roadtrip]" title="'.$ligne['alt'].'" >
 <img src="../pages/mini-galerie.php?f='.$ligne['photoref'].'" alt="'.$ligne['alt'].'" border="0" width="185px" height="124px" />
 </a>
 <br/>
<span class="bleucl">Nom : </span>'.$ref.' <br/>
<span class="bleucl">Déscription : </span><br/>'.$alt.'</div>';
          }
          }
search();
?>
  </div>
voilà, jéspere que vous pourrez m'aider a résoudre au moins le 1er probleme car sans ça je peut pas mettre mon nouveau site en ligne.

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

13 oct. 2009, 17:23

pourquoi tu utilises against ? tu as définie un recherche fulltext sur ta table ?
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 620 Messages

13 oct. 2009, 17:30

et bien le moteur de recherche a 2 criteres. apres mon code n'est pas parfait je l'ai fait en suivant des tutos et autres exemple sur internet... on peut surement l'amelioré mais je suis pas un pro donc dure dure...
le probleme des majuscules viendrait de là ?????

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

13 oct. 2009, 17:32

against est utiliser pour la recherche fulltext donc tes champs doivent être en fulltext

regarde le tuto sur le fulltext http://omiossec.developpez.com/mysql/fu ... ion_index/ car il te manque peut etre quelques choses pour que ca fonctionne
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 620 Messages

13 oct. 2009, 17:41

dans ma base j'ai fait :
CREATE TABLE `IWgalerie` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `type` varchar(40) collate latin1_german2_ci default NULL,
  `ref` varchar(20) collate latin1_german2_ci default NULL,
  `exemple` varchar(20) collate latin1_german2_ci default NULL,
  `alt` text collate latin1_german2_ci,
  `photoref` varchar(255) collate latin1_german2_ci default NULL,
  `photoex` varchar(255) collate latin1_german2_ci default NULL,
  PRIMARY KEY  (`id`),
 [b] FULLTEXT KEY `recherche` (`ref`,`exemple`,`alt`)[/b]) 
ENGINE=MyISAM AUTO_INCREMENT=692 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=692 ;


mes champs ne sont ils donc pas en full texte en fesant ça ?

je viens de regardé le tuto que tu propose et si je ne me trompe c'est bien ça que j'ai fai.

PAR CONTRE POUR LE PROBLEME DE MAJUSCULS c'est bon le soucis étati que je fesait des test de recherche sur des mot de 3 lettre comme par exemple "st amé" et du coup comme sql ne gere par défaut que les mots au dessus de 3 lettre j'avais 0 resultats.


ET NOUS voilà donc au 2éme probleme qui lui va posé bien plus de probleme car d'apres que que je voi sur le net c'est pas facile a resoudre.
Alors si quelqu'un sait comment resoudre le probleme des accents... merci d'avance