moteur de recherche dans petite annonce

Mammouth du PHP | 804 Messages

18 sept. 2008, 09:36

bonjour,

je suis en train de développer un petit moteur de recherche qui me cause des problèmes, la recherche peut se faire de trois façons, par mots-clés ou en sélectionnant deux options différentes proposées dans des sélectbox.

si je ne tape pas de mots clés ma requête fonctionne correctement en respectant les options choisies dans les sélectbox.

mais si je choisis une option dans les sélectbox couplés à un mots-clés ça ne marche plus ma requête ne me retourne rien.
// critères de recherche
	if ($s_race){
	 $ra  = "&& ann_Race = \"$s_race\" ";
	}else if($s_race == "0"){
	$ra  = "";
	}else{
	$ra  = "";
	}
	 
	if ($s_rub){
	$rub  = "&& ann_rubrique = \"$s_rub\" ";
	}else if($s_rub == "0"){
	$rub  = "";
	}else{
	$rub  = "";
	}
	 
// Prepare la requete MySql 

if($search){// si recherche (  cette requête ne fonctionne pas )

	$requete = "SELECT * FROM source_annonce WHERE 
	Titre LIKE '%".$search."%' OR 
	LOWER(Titre) LIKE '%".$search."%' OR
	Texte LIKE '%".$search."%' OR 
	LOWER(Texte) LIKE '%".$search."%' OR 
	WHERE Valide=\"1\" ".$ra." ".$rub."  
	ORDER BY Titre ASC"; 
	
}else{

unset($search);

// si pas recherche (  cette requête marche à merveille )
$requete = "SELECT * FROM source_annonce WHERE Valide=\"1\" $ra $rub ORDER BY Titre ASC ";

}

$query = mysql_query($requete); 

merci d'avance je suis en plan :?

ViPHP
ViPHP | 4039 Messages

18 sept. 2008, 09:42

Texte LIKE '%".$search."%' OR
Le champs Texte est de quel type ? Parce que bon, rechercher avec un 'like' dans un champ texte, c'est tout sauf optimal.. mieux vaut t'orienter vers la recherche fulltext.

Et ça t'éviteras cette double recherche, qui ne fait que ralentir encore plus ta requête.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 804 Messages

18 sept. 2008, 09:51

c'est du type text
mais j'ai optimisé mes recherches dans la base de donnée en type FULLTEXT sur ma variable search en relation avec le champ Titre et Texte.

je viens aussi de voir que j'ai aussi un where en trop mais j'ai toujours besoins d'aide ca ne marche toujours pas.

nouveau code
$page = isset($_GET['page']) ? $_GET['page'] : '';

if($_POST['search']){
$search = htmlentities($_POST['search'],ENT_QUOTES); 
}
if($_GET['search']){
$search = htmlentities($_GET['search'],ENT_QUOTES); 
}

// moteur critère
	if ($s_race){
	 $ra  = "&& ann_Race = \"$s_race\" ";
	}else if($s_race == "0"){
	$ra  = "";
	}else{
	$ra  = "";
	}
	 
	if ($s_rub){
	$rub  = "&& ann_rubrique = \"$s_rub\" ";
	}else if($s_rub == "0"){
	$rub  = "";
	}else{
	$rub  = "";
	}
	 
// Prepare le requete MySql 
if($search){
// si recherche
	$requete = "SELECT * FROM source_annonce WHERE 
	Titre LIKE '%".$search."%' OR 
	LOWER(Titre) LIKE '%".$search."%' OR
	Texte LIKE '%".$search."%' OR 
	LOWER(Texte) LIKE '%".$search."%' 
	&& Valide=\"1\" $ra $rub 
	ORDER BY Titre ASC"; 
	
}else{

unset($search);
// si pas recherche
$requete = "SELECT * FROM source_annonce WHERE Valide=\"1\" $ra $rub ORDER BY Titre ASC ";

}

$query= mysql_query($requete); 

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 sept. 2008, 09:58

Sujet qui peut éventuellement t'aider (surtout point 2) :)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 804 Messages

18 sept. 2008, 10:10

:oops: :oops:
SELECT * FROM source_annonce WHERE Titre LIKE '%indemnes%'
OR LOWER(Titre) LIKE '%indemnes%'
OR Texte LIKE '%indemnes%'
OR LOWER(Texte) LIKE '%indemnes%'
&& Valide="1"
ORDER BY Titre ASC
fausse alerte
SELECT * FROM source_annonce WHERE Titre LIKE '%indemnes%' OR LOWER(Titre) LIKE '%indemnes%' OR Texte LIKE '%indemnes%' OR LOWER(Texte) LIKE '%indemnes%' && Valide="1" && ann_Race = "Berger Australien Shepherd" ORDER BY Titre ASC
je ne vois rien de génant dans cette requete :?:

ViPHP
ViPHP | 4039 Messages

18 sept. 2008, 10:24

et avec des parenthèses ?

Code : Tout sélectionner

SELECT * FROM source_annonce WHERE ( Titre LIKE '%indemnes%' OR LOWER(Titre) LIKE '%indemnes%' OR Texte LIKE '%indemnes%' OR LOWER(Texte) LIKE '%indemnes%' ) AND Valide="1" AND ann_Race = "Berger Australien Shepherd" ORDER BY Titre ASC
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 1353 Messages

18 sept. 2008, 10:26

Bonjour,

Cela ne manque pas de parenthèse ? En effet j'imagine que tu veux quelque chose comme :
  $requete = "SELECT * FROM source_annonce WHERE  
    (Titre LIKE '%".$search."%' OR  
    LOWER(Titre) LIKE '%".$search."%' OR 
    Texte LIKE '%".$search."%' OR  
    LOWER(Texte) LIKE '%".$search."%')  
    && Valide=\"1\" $ra $rub  
    ORDER BY Titre ASC"; 
Car sinon tout se joue sur la dernière condition... Quand tu dis que ca marche pas ca veut dire que la requete ne s execute pas ou que tu n obtiens pas ce que tu veux comme résultats ?

EDIT : Berzemus est trop rapide pour moi :D
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Mammouth du PHP | 804 Messages

18 sept. 2008, 10:31

après l'intervention de Berzemus j'ai vu que j'avais un WHERE de trop, depuis la requete fonctionne mais ne me donne pas le résultat voulu.

en gros si je mets un critère de recherche par mot clé , il ne prend plus en compte mes options choisis dans les selectboxs


incroyable guilt92 je réédite ce message pour t'annoncer que tes parenthèses ont été efficaces, je n'y aurais pas pensé puisque je ne le savais pas.
merci beaucoup tu m'enlèves une épine du pied :wink:
Modifié en dernier par dogmongo le 18 sept. 2008, 10:39, modifié 2 fois.

Mammouth du PHP | 1353 Messages

18 sept. 2008, 10:36

en gros si je mets un critère de recherche par mot clé , il ne prend plus en compte mes options choisis dans les selectboxs
Même avec les parenthèses ?
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Mammouth du PHP | 804 Messages

18 sept. 2008, 10:40

si si super guilt92 :wink:
merci mille fois

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

18 sept. 2008, 11:15

Voir les priorités des opérateurs

la requete vérifiait que :

Code : Tout sélectionner

Titre ~ 'indemnes' OU LOWER(Titre) ~ 'indemnes' OU Texte ~ 'indemnes' OU LOWER(Texte) ~ 'indemnes' ET Valide="1"
seul la dernière ligne est affectée par la valeur du champ "Valide"... donc du moment que le mot recherché apparaissait dans un des champs la ligne est retournée.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 804 Messages

18 sept. 2008, 16:34

merci pour l'explication Truc :wink: