MOTEUR DE RECHERCHE

cs_loupile Messages postés 95 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 7 avril 2011 - 18 déc. 2006 à 12:40
cs_loupile Messages postés 95 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 7 avril 2011 - 29 mars 2007 à 10:48
bonjour,

j'ai fais un moteur de recherche, oui mais voila il ne fonctionne que sur une chaine ... normale  je recupère la valeur de mon champ de recherche dans $keys ...
comment ensuite sir $keys contient plusieurs mots, lui demander de faire la recherche sur tous les mots ... je suppose qu'il faut que je découpe la chaine ... mais comment faire pour lui dire de choisir chaque élément de la chaine et de refaire la requête jusqu'au dernier mot de la chaine ...

merci de votre précieuse aide

22 réponses

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
19 déc. 2006 à 13:29
Euuuuh... excusez moi de vous le dire mais vous hallucinez avec vos boucles là... si j'entre 30 mots pour une recherche vous allez faire 30 requetes SQL... .. ?

Qui plus est vous n'échappez pas les mots clés... d'une part ça risque de planter d'autre part vous risquez de vous retrouver avec une belle SQL injection... et il y a une faille XSS au niveau de l'affichage des résultats... .. .

$like = '';
$limit = empty($limit) ? 10 : $limit;

if(!empty($keys))
{
    $words = explode(' ', trim($keys));
   
    $words[0] = mysql_real_escape_string($words[0]);
    $nom = 'nom LIKE \'%'.$words[0].'%\'';
    $desc = 'description LIKE \'%'.$words[0].'%\'';
    $keyword = 'keyword LIKE \'%'.$words[0].'%\'';
    $i = 0;
   
    while(isset($words[++$i]))
    {
        $words[$i] = mysql_real_escape_string($words[$i]);
        $nom .= ' OR nom LIKE \'%'.$words[$i].'%\'';
        $desc .= ' OR description LIKE \'%'.$words[$i].'%\'';
        $keyword .= ' OR keyword LIKE \'%'.$words[$i].'%\'';
    }
   
    $like = ' AND ('.$nom.' OR '.$desc.' OR '.$keyword.')';
}

$result = mysql_query('SELECT * FROM flux WHERE ONAIR=\'OUI\''.$like.' ORDER BY UPDATED DESC LIMIT '.(int)$debut.','.(int)$limit);

if (($nrows = mysql_num_rows($result)) < 1)
    echo '
                Nous n\'avons aucun résultat pour votre recherche avec '.htmlentities($keys).'
           

';
else
{
    echo '
                Nous avons '.$nrows.' résulats pour votre recherche avec '.htmlentities($keys).'
           

';
   
    // affichage des résultats
}

C'est loin d'être parfait mais c'est déja mieux... .. .

@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
cs_loupile Messages postés 95 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 7 avril 2011
29 mars 2007 à 10:48
Bonjour,

je me suis inspiré ce que proposais kankrelune pour mon moteur, mais voià ca marche super avec un seul mot, mais dès qu'il y en a 3 ca ne fonctionne plus ...
je vous donne le code ... j'ai fais mes essais avec bail (pour un mot) et signer un bail pour plusieurs ...
merci de votre précieuse aide ...

/// moteur de recherche ///

$keys= $recherche;
$like='';
$limit = empty($limit)?6: $limit;

if(!empty($keys))
{
$words = explode(' ', trim($keys));
  
    $words[0] = mysql_real_escape_string($words[0]);
    $keyword = 'keywords LIKE \'%'.$words[0].'%\'';
    $i = 0;
  
    while(isset($words[++$i]))
    {
        $words[$i] = mysql_real_escape_string($words[$i]);
        $keyword .= 'keywords LIKE \'%'.$words[$i].'%\'';
    }
  
    $like = ' AND ('.$keyword.')';
}

$query27 = ' SELECT * FROM contents WHERE actif=\'1\' '.$like.' ORDER BY titre ';
$query227 = $query27;
$result227 = mysql_query($query227);
$query27.= " LIMIT $debut, $limit";
$result27 = mysql_query($query27);

pour le test http://dev.entreprenez.fr
0
Rejoignez-nous