Page 1 sur 1

Système de recherche dans plusieurs champs

Posté : 17 févr. 2012, 15:19
par Texicitys
Hello!

Je suis en train de faire un système de recherche pour mon site.

J'ai fait une case ou l'on peu sélectionner si l'on veut que les mots clés tapés se trouve uniquement dans le titre du document ou dans le titre ou la description, ou n'importe ou dans le document.

Voici la boucle que j'ai pris sur le net pour séparer les mots et faire ma requette:
foreach($mots as $mots_boucle) //tant que le nombre de mots de la 		recherche est supérieur à celui de la boucle, on continue en incrémentant à chaque fois la variable $nombre_mots_boucle
		{
			$valeur_requete .= $and_ou_or.' '.$champ.' LIKE \'%' . $mots_boucle . '%\''; //modification de la variable $valeur_requete
		}
		$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou or au début de la boucle
Ici la requete donne : monchamp LIKE mot OR (AND) monchamp LIKE mot2, etc...
J'aimerais que si l'on clique sur chercher dans titre et description. La requete soit : monchamp LIKE mot AND(OR) monchamp LIKE mot2 OR monchamp2 LIKE mot AND(OR) monchamp2 LIKE mot2, etc..

Je ne suis déjà pas certain que c'est comme ça qu'il faut procéder pour chercher les mots taper dans plusieurs champs.

Voici comment j'ai procédé:
D'abord, je change monchamp en fonction du lieu de recherche.
// Ajouté les autres lieux ou chercher
	if ($champ == "titre")
    {
        $monchamp = array('work_name'); 
    } 
    elseif ($champ == "titredesc")
    {
        $monchamp = array('work_name', 'work_desc');
    }
	else
	{
		$monchamp = array('work_name', 'work_desc', 'dom_name','doc_format','doc_name','work_dateR','work_degre','work_type','work_autors');
	}
Ensuite je ne sais pas trop comment faire pour obtenir le resultat que je désire..
J'ai essayé de faire une boucle dans la boucle:
$valeur_requete = '';
	foreach ($monchamp as $champ)
	{
		foreach($mots as $mots_boucle) //tant que le nombre de mots de la 		recherche est supérieur à celui de la boucle, on continue en incrémentant à chaque fois la variable $nombre_mots_boucle
		{
			$valeur_requete .= $and_ou_or.' '.$champ.' LIKE \'%' . $mots_boucle . '%\''; //modification de la variable $valeur_requete
		}
		$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou or au début de la boucle
	}
Mais ça ne m'affiche pas le OR que je veut mais toujours la variable $and_ou_or .

J'espère que mon problème et bien posé et que vous allez pouvoir m'aider :)

Merci d'avance !

Re: Système de recherche dans plusieurs champs

Posté : 17 févr. 2012, 19:07
par Krabosek
Bonsoir,

Question bête que vaut $and_ou_or ?

Il me semble que le tableau mot_boucle est un tableau à 2 dim.


$monchamp = array ('c1','c2','c3');
$mots_boucle = array ('v1','v2');

$valeur_requete = '';
foreach ($monchamp as $champ)
{ $and_ou_or = " AND (";
foreach($mots_boucle as $mots)
{
$valeur_requete .= $and_ou_or . ' ' . $champ . ' LIKE \'%' . $mots . '%\'';
$and_ou_or = " OR ";
}
$valeur_requete .= " ) ";
}
$and_ou_or = " AND ";
$valeur_requete = ltrim($valeur_requete,$and_ou_or); //suppression de AND ou or au début de la boucle
echo ' requete : ' . $valeur_requete;

?>
Résultat

( c1 LIKE '%v1%' OR c1 LIKE '%v2%' ) AND ( c2 LIKE '%v1%' OR c2 LIKE '%v2%' ) AND ( c3 LIKE '%v1%' OR c3 LIKE '%v2%' )

Pas sûr que ce soit le résultat attendu


Bonne réception.

Re: Système de recherche dans plusieurs champs

Posté : 17 févr. 2012, 19:57
par Texicitys
Bonjour,

Merci pour ta réponse!

$and_ou_or comme son nom l'indique c'est AND (si le membre choisi que le résultat contient tous les mots de la requête) ou OR (si le membre choisi que le résultat contient au moins un mot de la requête.

Comme résultat j'aimerais donc :

( c1 LIKE '%v1%' $and_ou_or c1 LIKE '%v2%' ) OR ( c2 LIKE '%v1%' $and_ou_or c2 LIKE '%v2%' ) OR ( c3 LIKE '%v1%' $and_ou_or c3 LIKE '%v2%' ).

Je regarde tous ça en détail ce soir.

Merci beaucoup

Re: Système de recherche dans plusieurs champs

Posté : 20 févr. 2012, 21:26
par Texicitys
Voilà, je pense avoir trouvé grâce à ce que tu m'as proposé :
$valeur_requete = '';
	foreach ($monchamp as $champ)
	{ 
		$valeur_requete .= " ( ";
		foreach($mots as $mots_boucle) 
		{
			$valeur_requete .=  ' '.$champ . ' LIKE \'%' . $mots_boucle . '%\' ' .$and_ou_or ;
		}
		$valeur_requete = rtrim($valeur_requete,$and_ou_or); //suppression de AND ou or en fin de la boucle
		$valeur_requete .= " ) OR ";
	}
	$valeur_requete = rtrim($valeur_requete,"OR "); //suppression de AND ou or en fin de la boucle
Merci :)

Re: Système de recherche dans plusieurs champs

Posté : 24 févr. 2012, 17:31
par Krabosek
Boujour,

Suis pas à jour.

Ne t'attends pas à des temps de réponses extraordinaires.

Déjà il me semble que le LIKE n'est pas indexable.
Ensuite si une des colonnes de recherche est en VARCHAR....


Bonne réception.