Moteur de recherche sur plusieurs mots

cs_loupile Messages postés 95 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 7 avril 2011 - 29 mars 2007 à 11:23
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 - 29 mars 2007 à 13:34
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

8 réponses

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 mars 2007 à 12:02
Salut, je te propose ça, dans un code condensé...

<?php

$keys= $recherche;

define('ACCENTS','éèêëàôîïç');

$words =
str_word_count($keys, 1, ACCENTS);


$cond = array();
foreach( $words as $word )
    if (strlen($word)>3)
        $cond[] = '(keywords LIKE \'%'.mysql_real_escape_string($word).'\'%)'; 

$keyword = empty($cond) ? '1' : implode(' or ',$cond); // ou avec 'and'...

$query27 = "SELECT * FROM contents WHERE (actif='1') and ($keyword) ORDER BY titre ';

//... blah blah ...
?>

Deux remarques :

* assures toi que les '%' sont bien échapé, car il y a un risque d'injection peut connu avec les % dans les conditions like

2. Connais-tu les indexes de type FULLTEXT ?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 mars 2007 à 12:05
remarque N°4 : je limite les mots de la recherche à 4 caractères... pour que ça ai un sens... a toi de voir !
remarque N°5 : j'ai oublié le "trim"...

faire ainsi :
// ....
$words =
str_word_count($keys, 1, ACCENTS);

array_walk($words,'trim'); // un trim pour tous pour poins trimer....
//...
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 à 12:34
bon bah je ne suis pas douée .. ca marche pas :-(  , en fait ca marche meme plus avec un seul mot ...

voilà le code ...
peux tu me dire .. ou je merde ?
merci de ton aide ..
/// moteur de recherche ///

$keys= $recherche;

define('ACCENTS','éèêëàôîïç');

$words = str_word_count($keys, 1, ACCENTS);
array_walk($words,'trim');

$cond = array();
foreach( $words as $word )
    if (strlen($word)>3)
        $cond[] = '(keywords LIKE \'%'.mysql_real_escape_string($word).'\'%)';

$keyword = empty($cond) ? '1' : implode(' and ',$cond); // ou avec 'and'...

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

$nrows = mysql_num_rows($result227);
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 mars 2007 à 12:42
J'ai peut-être fais une erreur de syntaxe qque part... t'as une erreur ?

pour m'aider, place un exit($query27) juste avant ton mysql_query, fait une recherche et donne moi la sortie.

STP
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_loupile Messages postés 95 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 7 avril 2011
29 mars 2007 à 12:47
voila ce que donne le exit

SELECT * FROM contents WHERE (actif='1') and (1) ORDER BY titre
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 mars 2007 à 13:15
Ah ben là, j'ai envie de dire que tu n'a pas de ligne avec acitif='1' dans la table contents....
Ou que t'as pas de table contents...
Ou que ta condition de limit dans la requète sort du nombre de lignes du resultat...

Dans tous les cas, soit sur que "and (1)" n'a jamais fait de mal à personne !

T'as essayé de lancer cette requète dans un PhpMyAdmin ou assimilé ?
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 à 13:22
alors j'ai bien 97 lignes avec actif='1' j'ai bien table contents ...
la requête s'execute correctement là n'est pas le probleme ..
le probleme c'est que le code ne definit pas les mots clés là non ?
la requete ne reprend pas :  keywords LIKE \'%'.mysql_real_escape_string($word).'\'% où alors je ne comprends vraiment rien :-)
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 mars 2007 à 13:34
Prenons les choses dans l'ordre, tu veux ?

Si la requète est SELECT * FROM contents WHERE (actif='1') and (1) ORDER BY titre
Et que cette requète sort 97 lignes chez PhpMyadmin, alors, elle devrait les sortir aussi dans ton site !

Donc si elle ne le fait pas, ce n'est pas un problème de requète...
A vues de nez, les raisons peuvent être :
1. La dite requète n'est pas éxécutée
2. Son resultat n'est pas traité, ou mal

(je raisonne comme ça, habitude de débuggeur... Genre : "avez vous branchez votre appareil à une prise de courant?")
0