J'utilise cette requête pour sélectionner des données:
mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'");
Le seul problème est qu'il sélectionne parfois plus que je ne le souhaiterais.
Par exemple, je voudrais sélectionner le produit "BLA", mais ma requête sélectionner également le produit "BLABLA". Pour être clair, si je voulais sélectionner "Produit 1", je ne veux pas que la requête sélectionne "Produit 11".
Quelqu'un sait-il comment gérer cela?
Merci.
Voulez-vous simplement rechercher les limites de Word? Si c'est le cas, une version brute pourrait être:
SELECT * FROM products WHERE product_name LIKE "% foo %";
Ou vous pourriez être un peu plus intelligent et rechercher les limites de Word avec le REGEXP
suivant
SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";
J'ai trouvé cette question sur Google, donc je pense que certaines personnes peuvent toujours tomber dessus alors voici ma tentative assez inélégante:
SELECT * FROM products
WHERE product_name LIKE 'BLA %' #First Word proceeded by more words
OR WHERE product_name LIKE '% BLA' #Last Word preceded by other words
OR WHERE product_name LIKE '% BLA %' #Word in between other words
OR WHERE product_name = 'BLA'; #Just the Word itself
Vous n'êtes pas sûr de l'efficacité ou si cela couvre tous les cas, alors n'hésitez pas à voter contre si c'est vraiment inefficace ou trop inélégant.
SELECT *
FROM products
WHERE product_name = 'BLA'
sélectionnera exactement BLA
SELECT *
FROM products
WHERE product_name LIKE 'BLA%'
sélectionnera BLADDER
et BLACKBERRY
mais pas REBLAND
Pour sélectionner BLA
comme premier mot de la chaîne, utilisez:
SELECT *
FROM products
WHERE product_name RLIKE '^Bla[[:>::]]'
AND product_name LIKE 'Bla%'
La deuxième condition peut améliorer les performances de votre requête si vous disposez d'un index sur product_name
.
Essayez d'utiliser des expressions régulières:
SELECT
*
FROM
`products`
WHERE
product_name regexp '(^|[[:space:]])BLA([[:space:]]|$)';
Supprimez le mot clé LIKE
et utilisez =
pour une correspondance exacte
[~ # ~] modifier [~ # ~]
n'oubliez pas d'échapper à la saisie utilisateur en utilisant mysql_real_escape_string sinon votre requête échouera si quelqu'un entre des guillemets dans la zone de saisie.
$search=mysql_real_escape_string($search);
mysql_query("SELECT * FROM products WHERE product_name='".$search."'");
Alors n'utilisez pas LIKE, mais recherchez l'égalité.
c'est à dire.
mysql_query("SELECT * FROM products WHERE product_name = '".$search."'");
BTW J'espère que vous nettoyez/échappez à la recherche $ avant de l'utiliser dans une requête.
vous pouvez utiliser une requête de sélection comme celle-ci, j'utilise également dans cakePHP et c'est utile.
Select * from `users` where username COLLATE latin1_general_cs LIKE '%$email%'
Utiliser égal (=)?
mysql_query("SELECT * FROM products WHERE product_name = '".$search."'");
Si vous cherchez à faire correspondre les mots EXACT, n'utilisez pas LIKE
.
EDIT: Cela clarifie un peu les choses alors. Ajoutez simplement un espace après le terme de recherche. Ou même ajoutez le tiret (-) si c'est toujours dans le terme de recherche.
mysql_query("SELECT * FROM products WHERE product_name LIKE '".$search." -%'");