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 -
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 :
Savez-vous comment faire pour effectuer une recherche sur plusieurs mots clés.
Merci de votre réponse.
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.
A voir également:
- Page de recherche en PHP
- Impossible de supprimer une page word - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Mettre google en page d'accueil - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
- Traduire une page en français - Guide
8 réponses
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.
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.
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.
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
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
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!
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!
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
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
Pour réduire le problème j'ai ajouté à la fin de la transformation des caractères spéciaux :
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 %
$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 %
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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?
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?
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.
@ +
$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.
@ +
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.
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.
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à.
$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à.
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 :
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 :
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