Recherche SQL sur plusieurs champs à la fois

stan47310
Invité n'ayant pas de compte PHPfrance

05 oct. 2012, 11:04

Bonjour tout le monde, voilà mon problème (qui malgré quelques recherches google en reste toujours un...)
j'effectue une recherche avec 1 input dans une base de données MySQL sur plusieurs champs : reference / designation / laboratoire.
J'arrive très bien à rechercher avec cet input les résultats indépendamment l'un de l'autre c'est à dire si je tape une référence même incomplète je la retrouve dans la base.
Seulement j'aimerai que si l'utilisateur tape dans le champ input la référence la designation et le laboratoire cela me retourne un résultat.
Je bloque car je n'arrive pas à comprendre comment retourner des résultats même lorsque la saisie est incomplète sur plusieurs champ MySQL à la fois.

J'espère m'être bien fait comprendre
Merci d'avance de votre réponse!
STaN47

ViPHP
ViPHP | 2577 Messages

05 oct. 2012, 11:30

De quoi disposes tu concrètement pour faire ta recherche ?

De ce que je comprends, l'utilisateur saisie une chaîne de caractères et tu dois décomposer cette chaîne pour faire ta recherche. A mon avis, tu te compliques la vie. Tu ferais ca plus simplement en proposant 3 zones de saisie à l'utilisateur. Le véritable problème est dans l'interprétation de la saisie, pas dans la mise en forme de la requête.

Une solution peu élégante à mon gout serai de découper la chaine en mot (function explode()) et de faire une recherche de chaque mot dans les trois champs.

where (reference like '%mot1%' or designation like '%mot1%' or laboratoire like '%mot1%')
and (reference like '%mot2%' or designation like '%mot2%' or laboratoire like '%mot2%')
...

Mammouth du PHP | 2278 Messages

05 oct. 2012, 13:17

Mazarini suggère une solution intéressante mais j'aimerais que tu expliques comment est conçue ta base de données:
j'effectue une recherche avec 1 input dans une base de données MySQL sur plusieurs champs : reference / designation / laboratoire.
Il y a nécessairement une table laboratoires:
id_labo entier aut_increment clef primaire
nom_labo
Référence et désignation, ça ne fait pas double emploi? Comme s'il pouvait y avoir plusieurs désignations pour la même référence...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Invité
Invité n'ayant pas de compte PHPfrance

05 oct. 2012, 15:07

Tout d'abord merci de vos réponses

C'est bien le souci, car il faut que l'utilisateur comprenne de quel produit il s'agit, d'où la présence de 2 champs "reference" et "designation". Il s'agit d'une base de données de dispositifs médicaux et un champ "référence" uniquement ne donne pas de renseignements à l'utilisateur.
J'ai mis en place une table dans laquelle plusieurs champs sont renseignés:
reference (text) / designation (text) / laboratoire (text) / stock (int) / stock minimum (int)...

Le principe est de réaliser à la maniere de google une recherche croisée. C'est à dire si mon utilisateur ne connait pas la référence il tape la désignation. ou l'inverse il connait la référence mais pas la designation. Ou les 2 à la fois.
C'est pour ca que je cherche à effectuer une recherche "multi champs", mais je l'aimerai sur 1 seul input.


Par exemple : Dans ma base de données j'ai pour une ligne :
reference : RF*GA35158M
laboratoire : TERUMO
designation : RADIOFOCUS GUIDEWIRE 150cm 0,035INCH

Je veux que lorsque l'utilisateur tape soit RF*GA35158M ou RADIOFOCUS GUIDEWIRE 150cm 0,035INCH il trouve la fiche du produit. (Ca j'ai réussi). Là ou ca se corse c''est lorsque l'utilisateur tape les 2 : RF*GA35158M RADIOFOCUS GUIDEWIRE 150CM 0;035INCH. Là je n'obtiens aucun résultat (bien sur je peux mettre des LIKE %...%) mais c'est pas optimal.

Qu'en pensez vous ?
(Ce qu'il est difficile d'expliquer simplement ce qu'on a en tête !)

ViPHP
ViPHP | 2577 Messages

05 oct. 2012, 16:07

Eventuellement tu peux essayer un outils comme htdig (dispo sur Linux). C'est un moteur de recherche google en moins puissant.

Pour ton problème, je butte sur des problèmes d’algorithme si tu veux faire une unique zone de saisie.
Comment obtenir "RF*GA35158M", "TERUMO" et "designation : RADIOFOCUS GUIDEWIRE 150cm 0,035INCH"
Ma méthode ne permettrait de rechercher que des mots avec présence de chacun ; c'est à dire "RF*GA35158M", "TERUMO", "RADIOFOCUS", "GUILDWIRE", "150cm" et "0,035INCH".

A tout hasard :
<?PHP
$mots = explode(' ',$_GET['mots'];
$criteres = array();
foreach ($mots as $mot) {
$criteres[] = "(reference like '%$mot%' or designation like '%$mot%' or laboratoire like '%$mot%')"; 
}
$cond = implode(' AND ',$criteres);
$select = 'SELECT ..... WHERE ID = .... AND' . $cond; 
?>
(quelques contrôles à ajouter)

Mais ca risque d'être long comme requete.

STaN47
Invité n'ayant pas de compte PHPfrance

05 oct. 2012, 17:08

Effectivement je suis conscient que ce n'est pas très conventionnel et surtout long...
Je vais malgré tout tester, je reviens vers vous en cas de problème
Merci beaucoup de votre aide
STaN47