[php] recherche dans ma bdd, sans la faire peter

recherche dans ma bdd, sans la faire peter [php] - PHP - Programmation

Marsh Posté le 15-09-2008 à 22:53:52    

:hello:  
 
imaginons une table article, avec un champ description contenant du code html
 
imaginons un formulaire de recherche, avec un champ mot clé,
 
si ce champ contient un mot, appelons le "motclé",  
 
ok :

Code :
  1. MysqlDB::requete("SELECT id FROM article WHERE description LIKE '%$motcle%');


 
mais si motclé = 'mot1 mot2',  
 
moi je veut rechercher en priorité ceux qui ont les deux a la suite, et apres les deux mots pas forcement qui se suivent ni dans le meme ordre, et apres ceux qui ont l'un ou l'autre.
 
ok pour deux mots clés c'est gerable,  
 
mais pour n mots clés ?
 
j'envoi chier le client ?  [:cerveau chacal_one]

Reply

Marsh Posté le 15-09-2008 à 22:53:52   

Reply

Marsh Posté le 16-09-2008 à 09:47:15    

Il suffit de respecter la première règle de normalisation de E. Codd, qui veut qu'un champ ne contienne qu'une seule information atomique, et non pas deux ou n.
Pour cela, il n'est nécessaire que de remplacer "mot1... motn" dans le champ "motclé" par un lien_liste_mots. Ce lien serait une cléf étrangère vers une nouvelle table T_liste_mots, qui contiendrait donc le lien plus un numéro de séquence et un mot. A chaque nouveau mot, il y aurait un enregistrement nouveau dans cette table. Cette table n'a pas besoin d'être visible de l'utilisateur. C'est juste une organisation interne de la base.
Bon courage !

Reply

Marsh Posté le 16-09-2008 à 10:01:18    

l'approche d'ovithill ets la plus propre, masi pour eviter de reinventer la roue, tu peux utiliser des outils spécifiques de recherche full text ( comem sphinx ou solr )  qui prendront , en plus , en compte les declinaisons des mots

 

sinon, l'approche bourrine

Code :
  1. $mots = explode(' ', $motcle);
  2. $query = "SELECT id FROm article WHERE 1 ";
  3. foreach($mots as $mot)
  4.    $query.=" AND description LIKE '%$mot%'";

Message cité 1 fois
Message édité par flo850 le 16-09-2008 à 10:01:35
Reply

Marsh Posté le 16-09-2008 à 12:33:14    

flo850 a écrit :

l'approche d'ovithill ets la plus propre, masi pour eviter de reinventer la roue, tu peux utiliser des outils spécifiques de recherche full text ( comem sphinx ou solr )  qui prendront , en plus , en compte les declinaisons des mots

 

sinon, l'approche bourrine

Code :
  1. $mots = explode(' ', $motcle);
  2. $query = "SELECT id FROm article WHERE 1 ";
  3. foreach($mots as $mot)
  4.    $query.=" AND description LIKE '%$mot%'";



OR, pas AND, si tu veux gérer tous les cas.[:joce]

 

(enfin en remplaçant le where 1, du coup.[:chrisbk])

Message cité 2 fois
Message édité par skeye le 16-09-2008 à 12:34:02

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2008 à 13:56:38    

skeye a écrit :


(enfin en remplaçant le where 1, du coup.[:chrisbk])


nan pas dans FloMyAdmin :o


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 16-09-2008 à 14:07:34    

ok, je viens de realiser que n'importe quel systeme fait peter la bd en nombre de resultats si l'utilisateur tape par exemple "z 750",  
 
bah ca cherche un z dans la description, donc ya enormement de resultats,  
 
avec like, je peut faire des expression regulieres "avancées" ?
 
pour dire que je recherche z, mais pas entouré d'autres lettres, juste entouré d'espaces, de points, de virgules ...
 
/me suis ptet mal expliqué ;)

Reply

Marsh Posté le 16-09-2008 à 14:09:04    

NewsletTux a écrit :


nan pas dans FloMyAdmin :o


hein?[:pingouino]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2008 à 14:09:50    

tomsoft a écrit :

ok, je viens de realiser que n'importe quel systeme fait peter la bd en nombre de resultats si l'utilisateur tape par exemple "z 750",  
 
bah ca cherche un z dans la description, donc ya enormement de resultats,  
 
avec like, je peut faire des expression regulieres "avancées" ?
 
pour dire que je recherche z, mais pas entouré d'autres lettres, juste entouré d'espaces, de points, de virgules ...
 
/me suis ptet mal expliqué ;)


Tu peux donner un minimum de taille pour ce qui est considéré comme un mot.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2008 à 14:11:15    

oui effectivement, mais "z 750" est un modele de moto en l'occurence, je voudrais quand meme afficher les produits contenant "z" tout seul, meme si ca ne fait qu'un charactere :/

Reply

Marsh Posté le 16-09-2008 à 14:12:14    

tomsoft a écrit :

oui effectivement, mais "z 750" est un modele de moto en l'occurence, je voudrais quand meme afficher les produits contenant "z" tout seul, meme si ca ne fait qu'un charactere :/


non, tu veux afficher ceux contenant "z 750", pas ceux contenant "z" ou "750"...[:aloy]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2008 à 14:12:14   

Reply

Marsh Posté le 16-09-2008 à 14:18:23    

skeye a écrit :


OR, pas AND, si tu veux gérer tous les cas.[:joce]
 
(enfin en remplaçant le where 1, du coup.[:chrisbk])


 
j'ai effectivement mal compris la question :o

Reply

Marsh Posté le 16-09-2008 à 15:33:06    

skeye a écrit :


non, tu veux afficher ceux contenant "z 750", pas ceux contenant "z" ou "750"...[:aloy]


 
non, je veut afficher ceux contenant z et ceux contenant 750, mais considerés comme des mots, ainsi l'article :
 
"blabla z bla" sortirai,
"blablaz bla"  ne sortirai pas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed