Page 1 sur 1

Fonction LIKE

Posté : 04 janv. 2010, 13:15
par fabrice88250
bonjour,
pour un petit moteur de recherche j'utilise dans ma requête LIKE.
$resultat=mysql_query("SELECT * FROM IWgalerie WHERE alt LIKE '%$mot%'"
Le problème que je rencontre est le suivant :
Dans ma recherche si je rentre par exemple le mot '$mot' papillon j'ai bien tout mes résultats qui me ressorte avec papillon.
Maintenant si je rentre par exemple un mot composé comme "forêt sapins" les résultats qui vont ressortir seront uniquement ceux qui contiennent exactement ma requête "forêt sapins" et c'est là que je souhaiterai optimisé la chose :).

par exemple si je rentre "forêt sapins" je veux que les résultats qui ressortent soit a la fois les résulta qui contiennent forêt, sapins, et forêt sapins.

je sais qu'il existe la fonction fulltexte et je l'utilise d'ailleur en partie dans mon moteur de recherche mais le problème et que je suis sur un serveur dédié et que j'ai besoin de faire des recherche sur des mots de 3 lettres et que je ne peu modifié mysql pour passer de 4 lettres a 3 lettres.
j'ai donc essayé ceci :
$nbrlettre = strlen($mot); 
if($nbrlettre = 3 )
{ $resultat=mysql_query("SELECT * FROM IWgalerie WHERE alt LIKE '%$mot%'");
}
else {
		if($champ == 'Toutes les galeries' )
		{
		$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(ref, exemple, alt) against ('$mot') ORDER BY type, ref, alt  ASC");
		}
		elseif($champ != 'Toutes les galeries' ){
		$resultat=mysql_query("SELECT * FROM IWgalerie WHERE type='$champ' AND match(ref, exemple, alt) against ('$mot') ORDER BY type ASC");
		}

}
donc si je rentre "lac" j'ai bien tout les resultats avec le mot lac -->ok
le hic et que maintenant si je rentre par exemple "lac toulouse" aucun resultat ne ressort alors qu'il existe bien "lac toulouse" dans la base.

je souhaite donc une aide pour résoudre au mieux se problème qui m'embête bien depuis plusieurs semaines maintenant.

Re: Fonction LIKE

Posté : 04 janv. 2010, 16:16
par jojo1000
Ce que tu peux faire, c'est long mais au moins ça marche : tu fais autant de requête que de mots saisis...

Re: Fonction LIKE

Posté : 04 janv. 2010, 17:44
par stopher
Salut ,

tu peux simplement commencer par découper ta chaine ( par les espaces ) et creer ta requete en fonction du nombre de mots trouvés , apres à toi de choisir entre le OR ou le AND

exemple :

chaine : "lac bleu"


Construction de la requete pour avoir la chose suivante :
... WHERE champ LIKE '%lac%'  [OR | AND] champ LIKE '%bleu%' ... 
Ch.

Re: Fonction LIKE

Posté : 04 janv. 2010, 20:22
par fabrice88250
stopher ok j'essaierai bien ta solution qui me parait être pas mal. par contre comment faire ?
donc ton exemple tu dissocie lac et bleu en 2 mot différents.
moi, la saisi se fait a partir de $mot (un champ de mon formulaire de recherche). Comment je dissocie $mot en fonction de son contenu ???
... WHERE champ LIKE '%$mot %'  [OR | AND] champ LIKE '%$mot %' ... 

Re: Fonction LIKE

Posté : 04 janv. 2010, 20:29
par jojo1000
tu récupères ta chaine et tu analyse chaque caractère, quand tu trouve un espace alors c'est que le premier mot est terminé

Re: Fonction LIKE

Posté : 04 janv. 2010, 20:31
par zeus
Tu pourrais partir du postulat que chaque mot est séparé par un espace. Quitte à le complexifier plus tard.

Du coup, pour découper un texte selon les espaces, tu peux utiliser la fonction explode().
$a_liste_mot = explode(' ', $mots); // Le 1er argument est le délimiteur, c'est à dire le caractère qui indique quand couper. Dans notre cas, c'est l'espace le délimiteur
Ensuite, il faut faire une boucle sur ce tableau pour construire un bout de la requête. Pour cela, il faut que tu vois quelle partie de la requête correspond à "rechercher les lignes dont le mot contient" dans ta requête et le faire construire dans une boucle.

PS : je suis volontairement vague dans cette dernière section, de manière à te laisser réfléchir un peu ;)

PS2 : jojo100, ta solution est beaucoup trop couteuse.

Re: Fonction LIKE

Posté : 04 janv. 2010, 20:47
par fabrice88250
ok j'ai essayé ça mais j'ai plus aucuns résultats qui sort.
$lesmots = explode(" ", $mot);
$nbrlettre = strlen($mot); 
if($nbrlettre = 3 )
{ $resultat=mysql_query("SELECT * FROM IWgalerie WHERE alt LIKE '%$lesmots[0]%' [OR | AND] alt LIKE '%$lesmots[1]%'");
}
else {
		if($champ == 'Toutes les galeries' )
		{
		$resultat=mysql_query("SELECT * FROM IWgalerie WHERE match(ref, exemple, alt) against ('$mot') ORDER BY type, ref, alt  ASC");
		}
		elseif($champ != 'Toutes les galeries' ){
		$resultat=mysql_query("SELECT * FROM IWgalerie WHERE type='$champ' AND match(ref, exemple, alt) against ('$mot') ORDER BY type ASC");
		}

}

Re: Fonction LIKE

Posté : 04 janv. 2010, 20:49
par Aureusms
J'ai eu le même besoin je me suis servi des tableaux pour créer ma requête.
Voilà ma fonction de l'époque (c'est cadeau pour la nouvelle année). Je l'ai adapté pour tes besoins mais vérifies quand même avant de l'appliquer
<?php
function creation_requete_selon_phrase ($phrase)
{
	$phrase = trim($phrase);
	if (strlen($phrase) <=3)
	{
		$requete_retour = "SELECT * FROM IWgalerie WHERE alt LIKE '%".$phrase."%'";
		return $requete_retour;
	}
	else
	{
		//on décompose tous les mots de la phrase
		$tab_mot_temp = explode(" ",$phrase);
		//purge des doublons et des faux espaces
		$tab_mot = array();
		foreach ($tab_mot_temp as $valeur)
		{
			if (!empty($valeur))
				array_push($tab_mot,trim($valeur));
		}
		//creation de la requete
		$requete = "SELECT * FROM IWgalerie ";
		
		if (empty($tab_mot))
			return FALSE; //il n'y avait que des espaces
		
		if (count($tab_mot) == 1)
		{
			$requete .= "alt LIKE '%".$tab_mot[0]."%'";
			return $requete;
		}
		
		if (count($tab_mot) > 1)
		{
			foreach ($tab_mot as $cle => $valeur)
			{
				$requete .= ($cle == 0) ? "WHERE" : "AND";
				$requete .= " alt LIKE '%".$valeur."%' ";				
			}
                        return requete;
		}
	}
}
?>
?>

Re: Fonction LIKE

Posté : 04 janv. 2010, 21:04
par fabrice88250
Merci pour votre aide mais je n'ai pas de resultats qui resortent.

voilà l'intégralité de ma fonction avec adaptation :
function creation_requete_selon_phrase ($phrase)
          {
$champ=$_POST['rechercherpar'];
$phrase=$_POST['mot_cle'];

echo '<img src="../images/fleche.png" alt="Les photos trouvées" class="imggauche" />
Vous rechercher portait sur : <span class="surljaune"> '.$phrase.' </span> <br/>Pour le type de galerie : <span class="surljaune"> '.$champ. ' </span><br/>Voici les photos trouvées en fonction de votre recherche.<div class="clear"></div>'; 


        $phrase = trim($phrase);
        if (strlen($phrase) <=3)
        {
                $requete_retour = "SELECT * FROM IWgalerie WHERE alt LIKE '%".$phrase."%'";
                return $requete_retour;
        }
        else
        {
                //on décompose tous les mots de la phrase
                $tab_mot_temp = explode(" ",$phrase);
                //purge des doublons et des faux espaces
                $tab_mot = array();
                foreach ($tab_mot_temp as $valeur)
                {
                        if (!empty($valeur))
                                array_push($tab_mot,trim($valeur));
                }
                //creation de la requete
                $requete = "SELECT * FROM IWgalerie ";
                
                if (empty($tab_mot))
                        return FALSE; //il n'y avait que des espaces
                
                if (count($tab_mot) == 1)
                {
                        $requete .= "alt LIKE '%".$tab_mot[0]."%'";
                        return $requete;
                }
                
                if (count($tab_mot) > 1)
                {
                        foreach ($tab_mot as $cle => $valeur)
                        {
                                $requete .= ($cle == 0) ? "WHERE" : "AND";
                                $requete .= " alt LIKE '%".$valeur."%' ";                               
                        }
                        return requete;
                }
        }


   while($ligne = mysql_fetch_array($requete))
          {
   $ref=$ligne['ref'];
   $alt=$ligne['alt'];
   $type=$ligne['type'];
   
 echo '<div class="search"><h4>'.$type.'</h4>
 
 <a href="../images/galerie/'.$ligne['photoref'].'" rel="lightbox[roadtrip]" title="'.$ligne['alt'].'" >
 <img src="../pages/mini-galerie.php?f='.$ligne['photoref'].'" alt="'.$ligne['alt'].'" border="0" width="185px" height="124px" />
 </a>
 <br/>
<span class="bleucl">Nom : </span>'.$ref.' <br/>
<span class="bleucl">Déscription : </span><br/>'.$alt.'</div>';
          }
          }
creation_requete_selon_phrase ($phrase);

Re: Fonction LIKE

Posté : 04 janv. 2010, 23:38
par stealth35
hello, si ton moteur de base est en myISAM, tu peux utiliser la fonction MATCH sur t'es index FULLTEXT

http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html

Re: Fonction LIKE

Posté : 05 janv. 2010, 00:27
par Ryle
Je ne sais pas si le problème vient de là, mais il manque un WHERE à la requête lorsque la recherche ne contient qu'un mot :)

Ceci étant, ça me parait quand même lourd pour une liste de conditions... personnellement je ferais comme ceci :
	$tab_mot = explode(" ",$phrase); //on décompose tous les mots de la phrase

	$tab_mot = array_unique($tab_mot); //purge des doublons 

	//creation de la requete
	$requete = "SELECT ... FROM IWgalerie ";

	$cond = array(); // tableau des conditions

	foreach ($tab_mot as $mot) {
		if (!empty($mot)) 
			$cond[] = " alt LIKE '%".mysql_real_escape_string($mot)."%' ";
	}
	
	if (!empty($cond)) // complète la requête
		$requete.= ' WHERE ' . implode('OR', $cond); 
		// utiliser "OR" pour n'importe quel terme, "AND" pour tous les termes

	return $requete;