Page de recherche en PHP
Fermé
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
-
30 juin 2008 à 16:05
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 - 30 juin 2008 à 22:06
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 - 30 juin 2008 à 22:06
A voir également:
- Page de recherche en PHP
- Supprimer une page word - Guide
- Recherche musique - Guide
- Recherche par image - Guide
- Consultez le code source de cette page. copiez la ligne indiquant aux moteurs de recherche de ne pas référencer la page. ✓ - Forum Référencement
- Alert php ✓ - Forum PHP
8 réponses
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 17:18
30 juin 2008 à 17:18
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.
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 18:02
30 juin 2008 à 18:02
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.
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
5
30 juin 2008 à 18:40
30 juin 2008 à 18:40
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
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 18:45
30 juin 2008 à 18:45
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!
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
5
30 juin 2008 à 18:58
30 juin 2008 à 18:58
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
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
5
30 juin 2008 à 19:55
30 juin 2008 à 19:55
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
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 20:14
30 juin 2008 à 20:14
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?
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
5
30 juin 2008 à 20:25
30 juin 2008 à 20:25
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.
@ +
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 20:48
30 juin 2008 à 20:48
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.
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
5
30 juin 2008 à 21:15
30 juin 2008 à 21:15
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é.
@ +
En tout cas, merci beaucoup de ton aide cela m'a grandement aidé.
@ +
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 21:22
30 juin 2008 à 21:22
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à.
JB_A
Messages postés
301
Date d'inscription
jeudi 19 juin 2008
Statut
Membre
Dernière intervention
13 février 2018
5
30 juin 2008 à 21:53
30 juin 2008 à 21:53
Merci de ta persévérance mais cela ne change pas grand chose à mon problème
X-Fan
Messages postés
805
Date d'inscription
mercredi 4 juin 2008
Statut
Membre
Dernière intervention
6 janvier 2010
19
30 juin 2008 à 22:06
30 juin 2008 à 22:06
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.
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.
30 juin 2008 à 17:49
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