[MySQL/PHP] Précision du Like '%valeur%' ??

Précision du Like '%valeur%' ?? [MySQL/PHP] - PHP - Programmation

Marsh Posté le 15-09-2010 à 14:49:24    

Bonjour,  
 
Voilà je suis confronté au problème suivant ... j'effectue une recherche dans une base de donnée SQL ...  
Ma recherche est du style :  
 
$query = "SELECT * FROM image WHERE mots LIKE '%$mots_search%'";
 
Valeur des données de ma base pour exemple :  
 
Panneau
Eau
Bouleau
Eaux
...
 
Ce que je souhaiterais serait de saisir une valeur dans un champ (ex: eau) et que le résultat ne retourne que les deux Eau et Eaux ... mais pas Panneau ni Bouleau ...
 
En clair quand je mets %% ca me retourne toutes les occurrences contenant "eau", et quand je mets = au lieu de LIKE sans les %% ca ne me retourne que Eau ... mais pas le Eaux ...  
 
Je penses que cela est faisable mais heu ... comment ;)
 
Merci pour votre aide !
 
Cordialement


Message édité par Odissine le 20-10-2010 à 11:58:34
Reply

Marsh Posté le 15-09-2010 à 14:49:24   

Reply

Marsh Posté le 15-09-2010 à 14:55:17    

ben...

Code :
  1. $query = "SELECT * FROM image WHERE mots LIKE '$mots_search%'"


 
ou alors j'ai pas compris la question...

Reply

Marsh Posté le 15-09-2010 à 15:17:28    

Tu peux même limiter un peu plus éventuellement en faisant ça :

Code :
  1. $SearchSize = strlen($mots_search);
  2. $query = "SELECT * FROM image WHERE mots LIKE '$mots_search%' and CHAR_LENGTH(mots) BETWEEN $SearchSize AND ".($SearchSize + 2);


le 2, c'est la tolérance : tu peux mettre 1, 2, 3 voire plus.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-09-2010 à 15:21:20    

Citation :

une base de donnée SQL

SQL server ? ou SQL comme utilisant le langage SQL, et dans ce cas, Oracle ? MySQL ? Access ? autre ?
Il existe peut-être soundex ou quelque chose d'approchant comme similar_text ou levenshtein.
En tous cas, cela existe en PHP, voir http://php.net/manual/fr/function.soundex.php

Reply

Marsh Posté le 15-09-2010 à 15:56:31    

ou utiliser une vrai couche de moteur de recherche comme sphinx , ou un moteur de recherche externe comme lucene/solr
ce que tu cherches a faire ( travailler sur la racine des mots ) s'appelle le steming , il  me semble


Message édité par flo850 le 15-09-2010 à 15:56:56
Reply

Marsh Posté le 15-09-2010 à 16:02:38    

Le steming, ça marche pas trop mal pour l'anglais, j'avais trouvé une adaptation GPL pour le français, mais franchement, ça marche pas terrible :/ Mieux vaut utiliser une BD linguistique, comme Lexique.org (la v3) qui est en GPL :) Pour chaque mot du français, t'as pleins d'infos (stats d'utilisations dans les livres ou films, fonction grammaticale, phonétique, découpage en syllabes, son lemme...).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 20-10-2010 à 11:18:33    

Tout d'abord merci pour tout ... Je pensais avoir répondu en vous remerciant mais j'ai du oublier :( ...
Bref ...  
Tout aussi curieux que cela puisse paraitre, le fati d'avoir mis LIKE '$variable%' ... a fonctionner pendant un temps ... puis la plus rien :(  
Voilà ma requête :

Code :
  1. SELECT * FROM table WHERE ref <> '' AND (mots LIKE 'eau%' OR titre LIKE 'eau%' OR legende LIKE 'eau%' OR ref LIKE 'eau%') ORDER BY date DESC


cela ne renvoi plus de résultat ...
J'ai changé titre LIKE '%eau%' ... en laissant les autres tel quel ... et la ca marche ...
 
Donc en clair j'ai toujours ce problème de requete sur un mots précis comme "eau" mais ma requête MySQL/PHP me renvoi ou TOUS les résultats "panneau", "eau", "rouleau", "eaux"... alors que je ne souhaite avoir que "eau" et "eaux" ... Bref c'est l'horreur ...
J'ai tout essayé :(
 
Le plus bizzare ... c'est que même sous phpMyAdmin ...  
Faire une requete comme  : SELECT * FROM image WHERE mots LIKE '%usa%' renvoi 6 résultats ... alors que WHERE mots LIKE 'usa%' renvoi 0 résultat !!!
Pourtant dans le champ "mots" ... j'ai bien le mot usa seul et la chaine usa ... (usa prohibition / Remusa)
Voilà comment je faisais avant :

Code :
  1. $mots_search = explode(" ", $_GET['mots']); //séparation des mots de tous les espaces
  2. $nombre_mots = count($mots_search); //nombre de mots
  3. for ($i=0;$i<$nombre_mots;$i++)
  4. {
  5.  $query_mots = "AND (mots LIKE '$mots_search[$i]%' ";
  6.  $query_mots .= "OR titre LIKE '$mots_search[$i]%' ";
  7.  $query_mots .= "OR legende LIKE '$mots_search[$i]%' ";
  8.  $query_mots .= "OR ref LIKE '$mots_search[$i]%'";
  9.  $query_mots .= " ) ";
  10. }


 
Merci pour votre aide ;)


Message édité par Odissine le 20-10-2010 à 14:11:06
Reply

Marsh Posté le 20-10-2010 à 14:53:14    

J'ai trouvé grâce à ce site ;)
 
http://www.tech-recipes.com/rx/484 [...] tatements/
 
Désolé et merci encore

Reply

Sujets relatifs:

Leave a Replay

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