Page 1 sur 1

Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 10 juin 2018, 13:32
par POKEMAT
Bonjour,

j'ai obtenu un système pour rechercher un fabricant dans ma barre de recherche mais je rencontre un problème.

Admettons que je cherche un fabricant qui s'appelle: Fabricant-exemple
Si je lance la recherche: fabricant-exemple j’obtiens le bon résultat

Par contre mon problème est que si je lance la recherche: fabricant exemple je n'obtiens pas le résultat attendu de fabricant-exemple.

Voici le détail de mon code dans mon model php (c'est là que j'ai fais des essais mais sans succès mais l'erreur ne vient peut être pas de là?):

Code : Tout sélectionner

<?php class Model ... { public function searchManufacturers($term) { $manufacturers = []; if (!empty($term)) { $manufacturers_sql = "SELECT * FROM " . DB_PREFIX . "manufacturer WHERE name LIKE '%" . $this->db->escape($term) . "%' ORDER BY name ASC;"; $manufacturers_query = $this->db->query($manufacturers_sql); foreach ($manufacturers_query->rows as $manufacturer) { $manufacturers[$manufacturer['manufacturer_id']] = $manufacturer; } } return $manufacturers; } }

et dans mon controller qui correspond:

Code : Tout sélectionner

$manufacturers_result = $this->model_catalog_manufacturers_search->searchManufacturers($filter_data['filter_name']); $data['manufacturers'] = array(); foreach ($manufacturers_result as $manufacturer) { $data['manufacturers'][] = array( 'manufacturer_id' => $manufacturer['manufacturer_id'], 'name' => $manufacturer['name'] ); }

Si quelqu'un à une idée je suis preneur, ça fais déjà plusieurs heures que je cherche sans succes :(
Encore mieux si quelqu'un trouve une solution qui permet aussi de diviser la requête en plusieurs recherches de mots.
Par exemple si je lance la recherche fabricant exemple.

J'obtiens le fabricant Fabricant-exemple mais également tous les fabricants qui contiennent les termes fabricant et exemple.
Là ça serait le top ! :D

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 10 juin 2018, 14:28
par @rthur
Bonjour,

La meilleure solution pour debuguer un problème de requête SQL, c'est de faire un var_dump() de ta requête juste avant de l'exécuter et de la tester dans phpMyAdmin.
Encore mieux si quelqu'un trouve une solution qui permet aussi de diviser la requête en plusieurs recherches de mots.
Par exemple si je lance la recherche fabricant exemple.

J'obtiens le fabricant Fabricant-exemple mais également tous les fabricants qui contiennent les termes fabricant et exemple.
Là ça serait le top ! :D
MySQL a une fonctionnalité de recherche fulltext qui est plutôt évoluée et qui est bien plus efficace qu'une recherche en LIKE %
https://dev.mysql.com/doc/refman/8.0/en ... earch.html

Et sinon une autre piste en SAAS, regarde du côté d'Algolia, si ta base à moins de 10 000 entrées, c'est gratuit et leur service est performant : https://www.algolia.com

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 10 juin 2018, 15:32
par POKEMAT
Bonjour, Merci beaucoup pour la réponse très intéressante, mais j'aimerai le faire dans mes fichiers déjà présents si c'est possible.

Est ce qu'il est possible d'obtenir ces résultats en ne modifiant que les fichiers php indiqués dans ma demande?

Si quelqu'un à une idée ça m'aiderai grandement :D

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 11 juin 2018, 13:18
par POKEMAT
Bonjour,

La meilleure solution pour debuguer un problème de requête SQL, c'est de faire un var_dump() de ta requête juste avant de l'exécuter et de la tester dans phpMyAdmin.
Encore mieux si quelqu'un trouve une solution qui permet aussi de diviser la requête en plusieurs recherches de mots.
Par exemple si je lance la recherche fabricant exemple.

J'obtiens le fabricant Fabricant-exemple mais également tous les fabricants qui contiennent les termes fabricant et exemple.
Là ça serait le top ! :D
MySQL a une fonctionnalité de recherche fulltext qui est plutôt évoluée et qui est bien plus efficace qu'une recherche en LIKE %
https://dev.mysql.com/doc/refman/8.0/en ... earch.html

Et sinon une autre piste en SAAS, regarde du côté d'Algolia, si ta base à moins de 10 000 entrées, c'est gratuit et leur service est performant : https://www.algolia.com
J'ai testé algolia mais j'utilise déjà un plugin du même type. Là ce que je cherche, c'est pour les gens qui font une recherche dans le moteur internet du site.

A mon avis il doit y avoir juste besoin d'ignorer les - dans la recherche et dans la prise des résultats, mais je ne sais pas faire donc si quelqu'un voit ce qu'il faut faire, n'hésitez pas ça me sauverait ! :D

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 11 juin 2018, 15:13
par @rthur
Une solution pourrait-être de le caractère tiret par un underscore _
En effet dans une requête MySQL de type LIKE, il y a 2 caractères jocker : le % qui remplace 1 ou plusieurs caractères et le _ qui remplace 1 caractère.
Avec un str_replace() ça se fait très facilement.
Le risque (faible mais qui existe) c'est que ça va matcher avec le tiret mais aussi n'importe quel caractère donc fabricant-exemple mais potentiellement fabricantAexemple aussi


Une autre solution, plus précise mais un peu plus complexe à mettre en oeuvre, serait d'utiliser REGEXP_LIKE() au lieu de LIKE() et de créer un pattern de regex pour que le tiret puisse être un tiret ou un espace, mais si tu n'as jamais fait de regex, la 1ère approche est un peu rugueuse, par ailleurs, il faut prévoir d'échapper tous les caractères systèmes des regex donc ça ajoute de la complexité.
https://dev.mysql.com/doc/refman/8.0/en ... egexp-like

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 11 juin 2018, 18:01
par POKEMAT
Bonjour,

merci beaucoup pour ta réponse, j'ai déjà fais des test avec le str_replace() mais je pense pas avoir essayé de la bonne façon. Par rapport à mon code donné dans le sujet, tu le place comment?

Merci beaucoup si tu peux répondre, je ferai un essai ce soir et je te dirai si ça fonctionne bien.

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 11 juin 2018, 18:07
par @rthur
je ne vais pas le faire à ta place, c'est en le faisant que tu vas apprendre.
Donc regarde la doc, inspire toi des exemples, lis bien les messages d'erreur pour essayer de les comprendre.
https://php.net/str_replace

Et si tu bloques, dis nous ce que tu as essayé et quelles sont les erreurs que tu rencontres ;-)

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 11 juin 2018, 18:14
par POKEMAT
je ne vais pas le faire à ta place, c'est en le faisant que tu vas apprendre.
Donc regarde la doc, inspire toi des exemples, lis bien les messages d'erreur pour essayer de les comprendre.
https://php.net/str_replace

Et si tu bloques, dis nous ce que tu as essayé et quelles sont les erreurs que tu rencontres ;-)
Mais juste pour savoir, c'est bien dans le model qu'il faut que je fasse ça, parceque dans le controller j'ai l'impression que ça ne modifie que l'apparence des résultats?

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 11 juin 2018, 18:38
par POKEMAT
Une solution pourrait-être de le caractère tiret par un underscore _
En effet dans une requête MySQL de type LIKE, il y a 2 caractères jocker : le % qui remplace 1 ou plusieurs caractères et le _ qui remplace 1 caractère.
Avec un str_replace() ça se fait très facilement.
Le risque (faible mais qui existe) c'est que ça va matcher avec le tiret mais aussi n'importe quel caractère donc fabricant-exemple mais potentiellement fabricantAexemple aussi


Une autre solution, plus précise mais un peu plus complexe à mettre en oeuvre, serait d'utiliser REGEXP_LIKE() au lieu de LIKE() et de créer un pattern de regex pour que le tiret puisse être un tiret ou un espace, mais si tu n'as jamais fait de regex, la 1ère approche est un peu rugueuse, par ailleurs, il faut prévoir d'échapper tous les caractères systèmes des regex donc ça ajoute de la complexité.
https://dev.mysql.com/doc/refman/8.0/en ... egexp-like
Bah Merci beaucoup! finalement je donne la solution grâce à ton aide .
La seule ligne à modifier de mon code de départ était dans model:

Code : Tout sélectionner

$manufacturers_sql = "SELECT * FROM " . DB_PREFIX . "manufacturer WHERE name LIKE '%" . $this->db->escape(str_replace(' ', '_', $term)) . "%' ORDER BY name ASC;";
Maintenant quand je tape le nom intégral avec le tiret j'ai le bon résultat, et quand je tape le bon nom sans le tiret j'ai aussi le bon résultat.

Merci beaucoup. La question que je me pose c'est de savoir si aussi simplement que ça, est il possible d'obtenir les résultats pour Fabricant et exemple quand je tape fabricant-exemple ou fabricant exemple?

Re: Problème pour rechercher un fabricant qui contient un '-' dans son nom

Posté : 12 juin 2018, 01:05
par @rthur
Merci beaucoup. La question que je me pose c'est de savoir si aussi simplement que ça, est il possible d'obtenir les résultats pour Fabricant et exemple quand je tape fabricant-exemple ou fabricant exemple?
Aussi simplement que ça non.Réfléchis à ta requête SQL, que dois tu indiquer pour avoir le résultat souhaité ?
Une fois que tu as déterminé ta requête SQL, on verra comment la construire.