LA RECHERCHE PAR MOT CLEF DANS UNE TABLE MYSQL AVEC PHP

cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008 - 19 nov. 2003 à 01:04
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008 - 16 juil. 2007 à 14:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18033-la-recherche-par-mot-clef-dans-une-table-mysql-avec-php

_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
16 juil. 2007 à 14:06
Pour ceux que ca interesse, ce source remplis ma demande

http://www.phpcs.com/codes/MOTEUR-RECHERCHE-DANS-BDD-II_38782.aspx

coder pour php5 j'ai commenter pour du compatible php4.

xD
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
15 juil. 2007 à 22:54
Bonjour,
j'utilise ton code depuis quelque temps et cela me conveniat au poil, mais maintenant la structure de ma table à changée et le code ne me donne pas les réponses attendues.

-Avant :

Recherche de mot clée sur un colonne qui ne contenait que du text.
Une recherche sur "mémoire ddr2 1024 corsaire" me sortait bien toutes les "mémoires ddr2 1024 corsaire"

-Maintenant :

colonne 1 :
famille : "Mémoire"
colonne 2 :
désignation : ddr2 1024
colonne 3:
Marque : "corsaire"

Le soucis c'est que tout ce qui contient "Mémoire", "ddr", et/ou "corsaire" est affiché.

Je suis tout a fait consient que c'est le but rechercher de cette fonction, mais il y a t'il moyen d'adapter pour avoir le même résultat que avant ??

D'avance merci.
cs_iubito Messages postés 629 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 9 octobre 2006
7 juin 2004 à 10:13
ça c'est une question de débutant en SQL.
select * from tableclient where nomclient like 'A%'

Voici des cours et docs qui te seront utils...
--> http://sqlpro.developpez.com : bonne lecture ! y'a de quoi lire :D
--> http://dev.mysql.com/doc/mysql/fr/ : doc officielle MySQL
allylo Messages postés 4 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 7 juin 2004
7 juin 2004 à 10:03
SLT je suis entrain de faire une base de donnée avec php mysql et je voulai savoir si on peu faire une recherche dans la table client des nom des client par leurs premiere lettre merci
yakou32 Messages postés 32 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 3 avril 2015
11 mai 2004 à 00:39
OK, merci pour toutes ces infos !

Malheureusement, je crains de ne pas avoir encore le niveau suffisant pour pouvoir en tirer parti...
Bon, je vais me rabattre sur un formulaire avec 1 saisie pour chaque champ. Peut-être sauras-tu alors m'aider avec cette histoire de caractère générique par défaut à ne pas prendre en compte dans la recherche ?

Ceci dit, comme le sujet t'interesse, sache que l'une des dernières versions de phpMyAdmin, (la dernière?) 2.5.6 propose un moteur de recherche sous forme de formulaire, avec une seule saisie, et le choix 1mot/tous les mots/phrase exacte
->voir la capture :
http://www.rocenpognes.com/temp/capture.gif

La solution n'est donc pas très loin, mais le code de phpMyadmin est trop hermétique pour le débutant que je suis :(
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
10 mai 2004 à 17:44
Peut-être qu'un commentaire like ((ardeche AND 2004)OR(2004 OR ardeche)) OU date like ((ardeche AND 2004)OR(2004 OR ardeche)) ferait l'affaire, mais je ne sais pas si c'est techniquement possible avec mysql.
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
10 mai 2004 à 17:36
Bah, sur le CMS que je suis entrain de développer, j'ai intégré au formulaire de recherche une case à cocher selon qu'on veuille rechercher la présence de tous les mots-clefs ou prendre aussi les résultats ne contenant que l'un des mots-clefs. Mais ça ne résoudrai pas ton problème puisque je cherche tous les mots-clefs mais dans un seul champ...

En réalité, je me suis aussi posé cette question pour pouvoir résoudre ce problème, mais pas encore trouvé de solution évidente. J'imagine qu'en créant un formulaire permettant de spécifier la ou les valeur(s) recherchée(s) pour chaque champs serait une solution, mais malheuresement, ce serait une solution assez fastidieuse à mettre en place et je n'en ai pas encore le temps.

Néanmoins, ce que tu peux faire, c'est reprendre mon code et générer un formulaire de recherche avancée créé dynamiquement selon les particularité de la table prise en compte.

Dans le CMS que je crée, cette option sera bien évidemment créée, mais pas pour le moment et je ne peux te proposer de code comme celui-là puisqu'aujourd'hui, je crée les formulaires d'ajout/modification dynamiquement et il serait difficile de ne tirer de mon code que les fonctions de recherche.

Par contre, il peut y avoir une solution basée sur les maths avec les et/ou mais ce sont des formules dont je ne me souviens plus très bien la forme. Un (a ou b) et (c ou d) equivaut je crois à un (a et c) ou (b et d) ou (a et d) ou (b et c). Donc, pour ton truc, un date like (ardeche ou 2004) et commentaire like (ardeche ou 2004) equivaut à un résultat (ardeche et 2004) mais pas dans le même champs mysql.

Bref, renseigne toi sur les opérateurs mathématiques, doit y avoir des formules intéressantes dans notre cas.
yakou32 Messages postés 32 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 3 avril 2015
10 mai 2004 à 13:44
Oui, ma première version de formilaire avait plusieurs champs de recherche.

Seulement, je crois qu'on est obligé de déterminer une valeur par défaut pour ces champs, et je n'ai plus retrouvé sur le net la valeur par défaut générique, pour que le moteur passe outre si le champ n'est pas rempli.

Pour la date, il y a pas de soucis, c'est la date de l'évènement, pas de l'enregistrement.

L'idéal serait de pouvoir adapter le AND au code de Hellway, ou alors de pouvoir choisir si l'on recherche tous les termes (AND, mais OR pour chaque champ) ou seulement l'un des termes (version actuelle)
cs_iubito Messages postés 629 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 9 octobre 2006
10 mai 2004 à 13:25
commentaire like ardeche or commentaire like 2004
AND
date like ardeche or date like 2004

mais bon ça risque de te sortir les commentaires contenant 2004 ayant été écris en 2004 :-p

donc un commentaire like ardeche and date like 2004 serait le top :)
yakou32 Messages postés 32 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 3 avril 2015
10 mai 2004 à 12:06
Salut !

Tout d'abord, merci beaucoup pour ton code !
J'ai écumé le web, et dur dur de trouver des explications sur les recherches MySQL multi-critères...

Peut-être pourriez-vous m'aider à modifier ce code.
Ma table contient plusieurs champs pour archiver des photos:
evenement, commentaires, date, auteur, file

Je cherche les photos correspondant aux termes "Ardèche 2004"
c'est à dire "Ardèche" et "2004" dans une ligne d'enregistrement donné. la date peut apparaitre dans le nom de l'évènement, ou dans le champ de date. Et "Ardèche" peut apparaitre dans l'évènement, ou les commentaires, etc... Cette technique me permettrait de rechercher dans tous les champs à la fois. Pas besoin d'avoir à spécifier ce que je recherche avec le formulaire de recherche.

Avec ce script, j'obtiens la requète suivante :
SELECT * FROM photos WHERE (evenement LIKE '%ardèche%' OR evenement LIKE '%2004%' OR commentaires LIKE '%ardèche%' OR commentaires LIKE '%2004%' OR date LIKE '%ardèche%' OR date LIKE '%2004%' OR auteur LIKE '%ardèche%' OR auteur LIKE '%2004%' OR file LIKE '%ardèche%' OR file LIKE '%2004%')

Je me retrouve évidemment avec toutes les photos d'Ardèche, y compris celles de 1999, par exemple, et toutes les photos de 2004, y compris celles qui ne concernent pas l'ardèche...

Il y aurait sans doute un AND à placer quelque part, mais comment m'y prendre ?

Merci beaucoup !
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
19 déc. 2003 à 14:50
Cette erreur signifie que la requête qui sert à récupérer les infos sur la table pour créer la requete de recherche est érronée ce qui n'est pas étonnant puisque je n'avais pas changé le code pour qu'il soit facilement adaptable. En fait, il fallait aussi changer le paramètre $RequeteTri=mysql_query("SHOW COLUMNS From $MaTable");
Mais bon, j'ai remodifié la source de façon à ce qu'il n'y ait que $MaTable à renseigné. Normalement, tout devrait fontionner désormais.

Il va de soit que la table NOM_DE_MA_TABLE doit éxister :-)
Sniperman113 Messages postés 98 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 21 février 2012
16 déc. 2003 à 18:24
Euuuhhh jai un pb si le gars ki a pondu pourrai mexpliker :( ça me met :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in recherche.php on line 63

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in recherche.php on line 80
()

kézako kom erreur ??? :(
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
5 déc. 2003 à 15:43
Heu... M'inputez pas le fait d'avoir commencé, j'ai laché l'affaire depuis longtemps, et je pense que vous devriez faire de même... :-)
cs_vallou Messages postés 13 Date d'inscription lundi 6 janvier 2003 Statut Membre Dernière intervention 31 mai 2005
2 déc. 2003 à 16:15
Oula je viens pour voir une source et je lis les commentaires pour voir ce qu'il en est et tout ce que je lis, c'est dispute sur dispute, c'est vraiment désagréable.. Le pire c'est qu'en dessous il est écrit : "J'approuve la charte de bonne conduite" Tu parles!!!
cs_ceced Messages postés 70 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 11 mai 2005
1 déc. 2003 à 01:21
STOP je ne veu ni fair moral , ni autre, mais pk ce chamaillé? pour un
un $query basé sur un moteur de recherche, y a pas de niveau ou tu sais php ou tu sais pas php se qui veu dire que celui qui connais php et capable de créé n importe quoi avec toute les librairie php ou fonction ou requet et j en passe...

Donc y a pas de niveau ...

Puis se disputé pour une source qui est gentilment proposé meme si ceu ou cell qui la connaisse bin ne la lisé pas mais laissé la pour les autres...

enfin bref c pas mon pb...
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
30 nov. 2003 à 23:19
Je ne connais pas tout, personne ne connais tout mais je cherche dans plein de langages différents ke je connais. Sais tu le nombre de langages qu'il existe ? il est impossible de connaitre ne serai ce que la moitié des langage qu'il existe. Je suis loin de me vanter ici je dis juste que le niveau ne convient pas avec cette source.
Ensuite pk je ne l'ai pas amélioré ? j'ai autre chose a faire (malgrés ce que l'auteur de cette source pense, je respect les gens qui posent les sources et je ne touche pas a leur travail) et surtout je dépose des tutos uniquements et aucunes sources. Mon but c d'aider les gens pas de macher le travail d'une certaines catégories de neuneux (je vise personne sur cette source m'enfin si vous pensez le contraire libre à vous) qui pompent une source en disant que c'est d'eux.
Le peu de sources que j'ai posté autre que des tutos c t pour aider certains qui m'en ont fait la demande.

Le niveau débutant est trés long, plusieur années, il faut un apprentissage sérieux et assez long pour en sortir vu la richesse de php et de mysql.
cs_SkyCrasher Messages postés 143 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 mai 2015
30 nov. 2003 à 22:58
Je ne veux pas te chambrer Tortuegeniale car tu as effectivement un bon niveau mais en profiter pour se vanter c'est un peu fort non ?
- Je cherche dans presque tous les langages lol !
(Tu les maitrises tous alors tu es un dieu ?)

- c pas parcequr tu utilises plusieurs fonction que c pas un niveau débutant. De plus récuperer le noms des tables on apprend ça en début d'apprentissage mysql.
(Si c'est pour débutant pourquoi n'as tu pas déposez l'amélioration de cette source toi même ?)

Moi je reconnais être débutant et ben je peux te dire que pour moi cette source n'es pas assez détaillée et expliquée par conséquent elle ne pourra pas me servir car je ne pourrai pas la modifier à mon aise !
cs_ceced Messages postés 70 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 11 mai 2005
30 nov. 2003 à 07:32
<?php
//--- texte ---//
$texte = "Un petit test pour %trouver% dans un texte %des mots% ";
$texte .= "qui sont %placés% comme ici %entre% une serie de %balises persos% ";
$texte .= "pour ensuite %les récupérer% et les placer %dans un tableau% et voilà";

//--- la regex ---//
$texte = preg_match_all( "/%(.*)%/Us" , $texte, $mots);

foreach($mots[1] as $val)
{
echo "Trouvé : $val
";
}

//Ce qui affichera ==>

//trouvé : trouver
//trouvé : des mots
//trouvé : placés
//trouvé : entre
//trouvé : balises persos
//trouvé : les récupérer
//trouvé : dans un tableau

?>
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
20 nov. 2003 à 16:29
et en faisant un select * from table where champs like ' %?% ' ça te ressortirai tous les mots avec un ? dedans. Esnuite tu fais la liste et tu remplaces nan ?
cs_iubito Messages postés 629 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 9 octobre 2006
20 nov. 2003 à 16:11
c'est bien beau mais encore faudrait-il qu'il arrive à me les sélectionner. et puis bon c pas la solution parce qu'il peut y avoir du polonais, du tchèque, et pour plusieurs trucs que je fais du roumain (6 caractères spéciaux).
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
20 nov. 2003 à 16:07
oh bah t'inquiete je connais pas que php lol c juste le poste de reve que je veux trouver mais je cherche dans presque tous les langages lol.

Sinon pour ton probleme, je sais pas combien peut y avoir de mot avec des lettres de ce genre dans ta base mais tu peux pas faire une moulinette ki remplace tout les dvo?ak par dvorak et pareil pour les autres mots ? Genre tu fait un selection de tous les mot qui ont un ? ensuite tu les modifies et tu fais un script ki remplace dans la base
cs_iubito Messages postés 629 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 9 octobre 2006
20 nov. 2003 à 15:47
bien tenté le bbcode mais ça marche pas, si tu te bornes à PHP/MySQL t'aura pas grand chose, à moins de trouver une petite boîte de dev web.
élargit tes possibilités, surtout ces temps-ci où l'emploi est rare (j'ai le mien je garde la place bien au chaud :-)) lol), il vaut mieux être plus souple. J'ai pris un boulot delphi / Java, je connaissais pas une miette de delphi, et java je manquait de pratik, bein en fin de compte tt ce passe bien
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
20 nov. 2003 à 15:46
Tu ne peux pas traiter les caracteres avant l'affichage vu qu'ils ne sont meme pas acceptés

oui au chomage et ? ça n'empeche pas que g les capacités et les diplomes tu veux une photocopie ? ;)
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
20 nov. 2003 à 15:34
Personnellement, je n'ai pas l'utilité de ce genre de ponctuation, mais je crois que si je devais être confronté à cela, je crois que je tenterai de le faire de ce côté :
Comme je filtre toutes les données entrée via des formulaires ou autres, et que je les interprète avant l'affichage, je convertirai simplement ces caractères avec un tag de mon choix à l'entrée et le remettrai sous sa forme initiale à la sortie. Ou bien, je n'accepterai que les caractère ANSI et tant pis pour les exceptions comme je le fais actuellement...

Au fait, un ingénieur informaticien au chômage, ce monde n'est vraiment plus ce qu'il était !
[b]Je cherche un poste de developpeur PHP mysql, si vous avez une proposition ou si vous voulez mon CV ==> [url]mailto:tortue.geniale@laposte.net/url
/b
cs_iubito Messages postés 629 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 9 octobre 2006
20 nov. 2003 à 15:16
ouais bein je cherche 'dvorak' mais si mon texte contient Dvo?ak ça le retourne pas, c bien la le pb. Parce que les textes sont insérés par un formulaire qui accepte pleins de caractères. Le russe, le grec, le chinois... ça marche, mais bon pour une recherche si déjà je peux avoir les caractères latins étendus ça me serait bien pratik dans plusieurs situations.
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
20 nov. 2003 à 14:40
En fait le probleme vient de l'encodage du serveur.
Pas défaut on est en ANSI et ça ne connait pas ces lettres la.
Si tu tapes <? echo "?"; ?> dans note pad il te dira quand tu veux l'enregister que l'enregistrement ANSI peux pas prendre certain caracteres et donc qu'ils seront traduit. Et quand tu exécute la page tu veras r.
L'astuce pour l'affichage c d'encoder la fichier en UTF-8 comme ça <? echo "?"; ?> retourne bien ?

exemple :
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
</head>


<?
echo "coucou Dvo?ák";
?>

</html>

retourne coucou Dvo?ák
(g testé sous dreamMX et note pad, Dream me demande meme pas et transforme le ? en r alors que note pad me demande).

Ensuite pour mysql, essaye peut etre de modifier l'encodage par défaut. Sinon cherche dvorak et te casse pas le cul lol.
cs_iubito Messages postés 629 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 9 octobre 2006
20 nov. 2003 à 10:10
alors puisque tu fouille dans ce secteur, j'aimerai avoir un truc... si tu me le trouve, je te met 10/10 et tu mériterai le niveau 3 :-p

en Mysql, un where champ like '%accordeon%'
va pouvoir (en général) ramener le mot accordéon sous pas mal de formes : áccordéon âççórdëòñ ... bref j'en passe, mysql va reconnaître les n tilde comme des n, les éèêëÊËÉÈ comme un e.

Mais le problème se complique avec des lettres polonaises, tchèques, roumaines... Par exemple, le musicien Dvorak s'écrit Dvorák avec un accent bizarre sur le R.
Et là mysql n'y arrive plus :(

REGEXP marche pas,

select soundex("Dvorak") => D162
select soundex("Dvořák") => D162
mais SOUNDEX n'est pas utile puisqu'on fait un like '%dovrak%' donc le mot peut être en milieu de phrase.

reste COLLATE mais
$query = "SELECT * FROM table
WHERE lower(word) like '%dvorak%'
or lower(comment) like '%dvorak%'
or _latin1 description COLLATE latin1_general_ci like '%dvorak%'
ORDER BY word ";
ne marche pas.

T'as une idée ? ;op
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
20 nov. 2003 à 01:18
oui je suis ingénieur informaticien pour ton info ;)
et évite de m'insulter je t'en remerci :). Je te fais part de mes remarques calmement et poliment alors fait pareil. Faut savoir assumer les critiques meme minimes (comme ici) et arreter de se la jouer.
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
20 nov. 2003 à 00:11
Tu dois savoir ça mieux que moi monsieur l'ingénieur informaticien. Au fait, je te prierai de ne plus poluer mes sources avec tes remarques minable, restes dans ton coin et je resterai dans le mien.
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
19 nov. 2003 à 17:44
c pas parcequr tu utilises plusieurs fonction que c pas un niveau débutant. De plus récuperer le noms des tables on apprend ça en début d'apprentissage mysql.
Hellway Messages postés 37 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 2 août 2004
19 nov. 2003 à 17:34
Bah, comme j'ai pas mis de commentaires, je ne pense pas qu'un débutant puisse comprendre ce code d'emblée et la méthode mysql utilisée n'est pas très connue puisqu'il s'agit directement de récupérer le nom des champs de la table pour ensuite seulement y effectuer des actions. Pro, j'dis pas, mais initié me semble être satisfaisant.

Et puis, comme ça, les prétentieux qui daigneraient y jeter un oeil pensant qu'ils ne peuvent rien apprendre sur u_n code pour débutant auraient raté ce script qui semble intéressant et qui n'est pas encore terminé dans son ensemble.

Au fait, je bosse dessus encore, mais j'ai dors et déjà fais une fonction qui mets en gras les termes de recherche lors de l'affichage. Si quelqu'un est intéressé, laissez un message ici et je la mettrai en commentaire.
cs_Tortuegeniale Messages postés 1123 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 26 juin 2008
19 nov. 2003 à 01:04
Je remet pas en doute ton code mais niveau 'initié' pour 20 lignes de code bateau c un peu beaucoup quand meme
Rejoignez-nous