Recherche par mots clés mutiple

hazmoon
Invité n'ayant pas de compte PHPfrance

23 mars 2009, 18:34

Bonjour j'ai ce code qui me permet uniquement recherche par expression exacte or j'aimerais pouvoir effectuer une recherche par mot multiple.

Par exemple dans une annonce j'ai ce texte: belle voiture verte diesel

Si je cherche "voiture verte" ça marche il trouve mon annonce
Par contre si je cherche "voiture diesel", rien n'est trouvé. Et c'est la mon problème ces deux mots existent dans mon annonce, mais mon moteur de recherche ne trouve rien!

Voici le code php:

Code : Tout sélectionner

$text_search = mosGetParam($_GET,'text_search','');
Et le code html:

Code : Tout sélectionner

<form action="<?php echo $url; ?>" method="get"> <input type="hidden" name="option" value="com_adsmanager" /> <input type="hidden" name="Itemid" value="<?php echo $itemid; ?>" /> <input type="hidden" name="page" value="search" /> <input class="inputbox" type="text" name="text_search" value="<?php echo $text_search; ?>" onblur="if(this.value=='') this.value='<?php echo $text_search; ?>';" onfocus="if(this.value=='<?php echo $text_search; ?>') this.value='';"/>
Je suis novice en la matière pourriez vous m'aider s'il vous plaît.

Merci d'avance
:wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2009, 19:49

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "PHP débutant".


Ta variable $text_search contient la valeur du champ spécifié par l'utilisateur. Ce qui serait interessant serait de voir comment tu l'utilises ensuite :)

Sachant que si tu ne veux pas chercher la chaine exacte, il te faudra "éclater" la chaine et tester la présence de chaque mot dans ton champ :) (avec des AND ou des OR selon que tu veuilles une recherche sur tous les mots ou sur n'importe lequel des mots)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 2 Messages

24 mars 2009, 13:21

Bonjour,

Voila je crois que c'est ici que ça se passe. Si je comprend bien ce code la recherche est faite dans le titre de l'annonce et dans le texte de l'annonce.

Code : Tout sélectionner

if ($text_search <> "") { $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') AND a.published = 1"; } else $search .= " AND a.published = 1";
Mais comment faire pour avoir une recherche multiple et non juste l'expression exacte?

Merci d'avance

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Petit nouveau ! | 2 Messages

24 mars 2009, 13:25

Voila, je me suis inscrit c'est mieux comme ça!

J'ai oublié une virgule dans mon précèdent post:

Si je comprend bien ce code, la recherche est faite dans le titre de l'annonce et dans le texte de l'annonce.

ViPHP
ViPHP | 1996 Messages

24 mars 2009, 14:50

J'ai fais un truc similaire mais je ne sais pas si c'est ce que tu recherches : Tout d'abord tu "explode" ton texte, tu purge les case vides, du trim les valeur et tu cherche dans ta requete sql
<?php
$tab_texte_temp = explode (" ",$texte);
//on purge les case vides (au cas où plusieurs espace ait été rentré)
//on purge aussi les balncs avant et après les valeurs
$tab_texte =array();
foreach ($tab_texte_temp as $valeur)
{
	$valeur = trim($valeur);
	if (!empty($valeur)) array_push ($tab_texte,$valeur);
}

//on fait un foreach avec toute les valeurs obtenues si elle sont dans le mêmes champs 
$requete = "SELECT champ FROM table WHERE ";
foreach ($tab_texte as  $cle => $valeur)
{
	$requete .= ($cle ==0) ? "champ LIKE '%$valeur%' " : " AND champ LIKE '%$valeur%' ";
}
echo $requete;
?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Invité
Invité n'ayant pas de compte PHPfrance

24 mars 2009, 18:28

Whaouh! J'ai rien compris! "explode" "trim" :cry:

En fait j'ai essayé de retrouver cette structure dans adsmanager.php, mais rien!
Voici ce qui correspond au moteur de recherche, c'est le code suivant qui est en fait une fonction:
if(isset($fields_searchable))
	{
		foreach($fields_searchable as $fsearch)
		{
			switch($fsearch->type)
			{
				case 'multicheckbox':
				case 'multiselect':
					$value = mosGetParam( $_GET, $fsearch->name, array() );
					for($i = 0,$nb=count($value);$i < $nb;$i++)
					{
						$url_param .= "&".$fsearch->name."=".$value[$i];
						if ($i == 0)
							$search .= " AND (";	
						$search .= "a.$fsearch->name = ',$value[$i],'";
						if ($i < $nb - 1)
							$search .= " OR ";
						else
							$search .= " )";	
					}
					break;
				case 'checkbox':
				case 'radio':
				case 'select':	
					$value = mosGetParam( $_GET, $fsearch->name, "" );
					if ($value != "")
					{
						$search .= " AND a.$fsearch->name = '$value'";
						$url_param .= "&".$fsearch->name."=".$value;
					}
					break;
					
				case 'price':
					$value = mosGetParam( $_GET, $fsearch->name, "" );
					if ($value != "")
					{
						$pos = strpos($value, '-');
						$fieldsql = "a.$fsearch->name + 0"; // Little hack to convert in number
						if ($pos !== false)
						{
							if ($pos == 1)
							{
								$search .= " AND $fieldsql < '".substr($value,1)."'";
							}
							else if ($pos == strlen($value) - 1)
							{
								$search .= " AND $fieldsql > '".substr($value,0,strlen($value)-1)."'";
							}
							else
							{
								$search .= " AND ($fieldsql >= '".substr($value,0,$pos)."' AND $fieldsql <= '".substr($value,$pos+1)."')";
							}
						}
						$url_param .= "&".$fsearch->name."=".$value;
					}
					break;
		
				case 'textarea':
				case 'number':
				case 'emailaddress':
				case 'url':
				case 'text':
					$value = mosGetParam( $_GET, $fsearch->name, "" );
					if ($value != "")
					{
						$search .= " AND a.$fsearch->name LIKE '%$value%'";
						$url_param .= "&".$fsearch->name."=".$value;
					}
					break;
			}
		}
	}
	
		
	if ($text_search <> "") {
		$search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') AND a.published = 1";
	}
	else
		$search .= " AND a.published = 1";
		
	$url .= $url_param;
	
	$query = "SELECT DISTINCT a.id FROM #__adsmanager_ads as a ".
						 "LEFT JOIN #__adsmanager_adcat as adcat ON a.id = adcat.adid WHERE $search";
	$database->setQuery($query);	
	$total = count($database->loadObjectList());
A la fin de ce code il y a ça:
if ($text_search <> "") {
		$search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') AND a.published = 1";
	}
	else
		$search .= " AND a.published = 1";
		
	$url .= $url_param;
	
	$query = "SELECT DISTINCT a.id FROM #__adsmanager_ads as a ".
						 "LEFT JOIN #__adsmanager_adcat as adcat ON a.id = adcat.adid WHERE $search";
	$database->setQuery($query);	
	$total = count($database->loadObjectList());
J'ai essayer de dechiffrer ce qu ça voulais dire mais je n'y arrive pas.

Est-ce que quelqu'un pourrait s'il vous plît jeter un coup d'oeil à ce code et me dire ce que je dois modifier dedans pour avoir une recherche avec mot-clé multiple?

Merci d'avance, je suis complètement perdu :( [/php][/code]

ViPHP
ViPHP | 1996 Messages

25 mars 2009, 11:32

Whaouh! J'ai rien compris! "explode" "trim" :cry:
C'est juste le nom des fonctions LOL :D
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr