2009-05-05 9 views
4

J'ai des enregistrements dans ma base de données qui sont recherchés avec l'entrée de l'utilisateur, et initialement, c'était suffisant pour trouver les enregistrements corrects.Comment puis-je retourner des enregistrements avec une requête MySQL en utilisant une expression régulière?

"SELECT id FROM plants WHERE Flower LIKE '%" . $sanitizedUserInput . "%'" 

Ce fonctionnait très bien, mais les choses ont commencé à se produire comme, la recherche « rouge » devenais plantes avec les dans l'ordre « rouge » caractères dans leur domaine Flower, et non simplement le mot entier ' rouge'.

On m'a suggéré de simplement mettre un espace de chaque côté de l'entrée de l'utilisateur, mais je sais que cela échouera là où le mot est le premier mot dans le champ, ou le dernier. Je pensais à moi-même, je devrais utiliser une expression régulière! Pour rechercher le mot où il a une frontière de mot de chaque côté.

Malheureusement, je n'ai jamais utilisé de regex dans une base de données auparavant. Comment construisez-vous une requête pour rechercher une base de données avec une regex? Heureusement, c'est aussi simple que cela:

"SELECT id FROM plants WHERE Flower REGEX `/\b" . $sanitizedUserInput . " \b/`" 

Répondre

7

Oui, c'est plutôt facile.

MySQL Reference Manual - Regular Expressions

Les séquences limites de mots dans les expressions régulières MySQL sont [[:<:]] et [[:>:]] donc vous allez finir avec quelque chose comme:

$query = "SELECT id ". 
      "FROM plants ". 
      "WHERE Flower REGEXP '[[:<:]]".$sanitizedUserInput."[[:>:]]'"; 
+1

Pour une raison quelconque, je trouve les documents mySQL confus .. – alex

+0

Merci pour cela, Chad. +1 – alex

+0

Vraiment? Je suis un grand fan des documents mysql. La fonction de recherche n'est pas géniale, mais la plupart des pages sont généralement écrites plutôt bien, une fois que je trouve la bonne. –

Questions connexes