Recherche par mots clés mutiple

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Recherche par mots clés mutiple

par Aureusms » 25 mars 2009, 11:32

Whaouh! J'ai rien compris! "explode" "trim" :cry:
C'est juste le nom des fonctions LOL :D

par Invité » 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]

par Aureusms » 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;
?>

par hazmoon » 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.

par hazmoon » 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]

par Ryle » 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)

Recherche par mots clés mutiple

par hazmoon » 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: