Page de recherche en PHP

JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   -  
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai une page de recherche avec un champ keyword.

Si je ne mets qu'un seul mot clé, pas de problème par contre si je désire plusieurs mots clés, il ne trouve rien.

Mon SQL est le suivant :

SELECT fjs_ticket_id, fjs_categoryticket_libelle, fjs_state_libelle, fjs_ticket_date_created, 
fjs_inus_prenom, fjs_inus_nom, fjs_ticket_userid, fjs_ticket_comment, fjs_ticket_contournement, 
fjs_ticket_soluce from tjs_ticket, tjs_state, tjs_category_ticket, tjs_internal_user 
where fjs_ticket_userid=fjs_inus_id AND fjs_ticket_stateid=fjs_state_id 
AND fjs_ticket_categorid=fjs_categoryticket_id 
AND (fjs_categoryticket_libelle LIKE '%keyword%' OR fjs_ticket_comment LIKE '%keyword%' OR
fjs_ticket_historique LIKE '%keyword%' OR fjs_ticket_contournement LIKE '%keyword%' 
OR fjs_ticket_soluce LIKE '%keyword%') ORDER BY fjs_ticket_stateid DESC, 
fjs_ticket_date_created ASC


Savez-vous comment faire pour effectuer une recherche sur plusieurs mots clés.

Merci de votre réponse.

8 réponses

X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Et bien tu dois d'abord décomposer ta chaine de caractère de keyword en plusieurs mots clés séparés et appeler la requête plusieurs fois (une fois sur chaque mot clé quoi.) Mais tout dépend de ce que tu veux et dois faire avec. La stratégie ressemblera à ça en tout cas.
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Merci pour ton aide,

C'est pourquoi je recherchais tout à l'heure une façon de transformer les caractères spéciaux.

J'arrive bien à décomposer ma valeur :

	$keyword=str_replace(" ","",$keyword);
	$keyword=str_replace("+","%",$keyword);
	$keyword=str_replace("OR","%",$keyword);
	$keyword=str_replace("OU","%",$keyword);
	$keyword=str_replace("ou","%",$keyword);
	$keyword=str_replace("AND","%",$keyword);
	$keyword=str_replace("and","%",$keyword);
	$keyword=str_replace("&","%",$keyword);
	$keyword=str_replace("et","%",$keyword);

	$key=explode("%",$keyword);


Mais Etant donnée que je ne connaît pas le nombre de mots clés saisie, je ne peux pas reproduire mon SQL

J'ai essayé un :

	$crit_key="";
	while($key){
	$crit_key=$crit_key." AND (fjs_categoryticket_libelle LIKE '%$key[i]%' OR 
fjs_ticket_comment LIKE '%$key[i]%' OR fjs_ticket_historique LIKE '%$key[i]%' 
OR fjs_ticket_contournement LIKE '%$key[i]%' OR fjs_ticket_soluce LIKE '%$key[i]%')";

	$key=$q->getrow();
	}


Mais il m'affiche tout les enregistrements car il ne traduit pas $key[i] et ne duplique pas le critère.

Merci de vos réponses
0
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Et bien.. défini quel caractère servira à la séparation des mots clés et tu comptes le nombre de fois que ce caractère apparait dans ta chaine principale ;)

EDIT: En fait, tu détermines quel caractère sert à séparer tes mots. Ensuite tu utilises explode() pour créer un tableau des mots et tu le parcours avec:

$str est ton résultat du explode!
$x=0;
while($x<sizeof($str)){
requête sql
$x++;
}

Un truc du genre quoi.
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Cela marche presque sauf 2 problèmes :

1) il ne veut pas m'afficher la valeur de $str. Si je mets dans mon SQL, $tr il me renvoie array et si je met $tr[x] ou $tr[i], il ne m'affiche rien

2) si je met un caractère spécial dans le champs (exemple : word et pdf), il me renvoit $tr[0] =word ; $tr[1]=pdf mais si je ne mets pas de séparateur, juste un espace, il me renvoit $tr[0]=wordpdf

Merci de ton aide
0
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Ton explode peut prendre les espaces non (comme délimiteur)? Je ne comprend pas trop le deuxième problème.
Pour le premier, tu dois faire:

$str est ton résultat du explode!
$x=0;
while($x<sizeof($str)){
echo $str[$x];
$x++;
}

Je dis echo comme exemple. Toi tu mets une requête SQL. Pour récupérer le contenu c'est $str[$x] qui sera donc consécutivement: 0, 1, 2, 3, ..., n (jusqu'à qu'il ait passé tous les mots quoi).

Tu dois choisir toi-même ce qui fait office de séparateur et en informer ceux qui vont utiliser le champ. Après cela, s'ils ne savent pas respecter tes conditions, tu n'y peux rien. Si on dit qu'il faut un ; entre chaque mot et qu'ils ne le font pas, que peux-tu y faire? Leur donner un cours d'apprentissage de la lecture tout au plus!
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Super le 1er problème est résolu.

Pour le deuxième en fait, si je défini que les espaces sont remplacer par % et que le caractère spéciale est remplacé par %.

Le résultat de "Word et PDF" renvoie Word%%%PDF donc 4 lignes du tableau donc 4 fois la recherche pour seulement 2 mots clefs.

Et si je ne considére que seul les caractères spéciaux sont remplacé par %, dans mon exemple précédent pas de problème :"Word et PDF" renvoie bien word%PDF donc 2 lignes du tableau renvoyé.

Seulement si l'utilisateur décide qu'il saisira "word PDF" (sans séparateur, le résultat renvoyé sera wordpdf donc ne correspondant à aucun mot clé.

Merci de ton aide
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Pour réduire le problème j'ai ajouté à la fin de la transformation des caractères spéciaux :

	$keyword=str_replace("%","",$keyword);


Pour remplacer les % par ""

Néanmoins, tout n'est pas résolu j'aimerais trouver une façon de comparer la chaine de caractère et s'il y a un caractère spécial, le remplacer par % et remplacer les espaces par "" ou s'il n'y a pas ce type de caractère, transformer les blancs en %
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Pourquoi veux-tu remplacer les caractères que tu dis "spéciaux" par %? Est-ce une nécessité?

Car ton but, c'est de récupérer tous les mots séparés par un espace ou par un de tes caractères, c'est cela?
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Oui mais comme c'est une page de recherche, si dans l'exemple keyword="Word et pdf" on je récupére
$key[0]=Word ;
$key[1]=et ;
$key[2]=pdf;

Donc le résultat de la recherche va me renvoyer tous les enregistrements de la base qui contiennent les mots "word", "et", "pdf" et je ne veux pas les réponses avec "et" dans le contenu.

@ +
0
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Ouai ok mais alors ne te casse pas la tête lol.

Premier problème de ta fonction. Si tu cherches "oulala et etralala"
Il va faire %lala % %ralala avec tes strreplace. Pas trop ça que tu veux non?

Juste une question, quand tu fais un explode(" ",$keyword); et tu as un string qui a l'air de "salut bonjour" mais qu'il y a 2 espaces blanc entre salut et bonjour, comment il le coupe? C'est tout ce que je n'arrive pas à trouver et pas le temps d'essayer.
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Je vais essayé de trouver sinon cela sera pas forcément optimisé mais tant pis.

En tout cas, merci beaucoup de ton aide cela m'a grandement aidé.

@ +
0
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Pour optimisé, j'ai trouvé cela:

$filtre = array("+","OR","OU","ou","AND","and","&","et");
$keyword = str_replace($filtre, " ", $keyword);
$key = explode(" ",$keyword);

Si ça ne fonctionne pas avec $filtre, ajoute un array $replace = array(" "," "," "," "," "," "," "," "); à la place de " " dans ton str_replace.

Ensuite, vérifie de quoi à l'air key en faisant echo de chaque objet:
echo $key[0];
echo $key[1];

Voir ce qu'il retourne au complet et ensuite tu auras matière à travailler avec des if pour filtrer ce qui ne devrait pas être là.
0
JB_A Messages postés 301 Date d'inscription   Statut Membre Dernière intervention   5
 
Merci de ta persévérance mais cela ne change pas grand chose à mon problème
0
X-Fan Messages postés 805 Date d'inscription   Statut Membre Dernière intervention   24
 
Ben ça évite d'avoir à répéter 50 str_replace O_O

Aussi, une fois que tu connais le contenu de $key, tu pourras avancer. Si tu as fait le test et que tu peux le dire, on verra pour la suite sinon je ne peux pas t'aider plus car je n'ai pas le temps de m'amuser à le tester maintenant.
0