Déjà il faut arrêter de te mélanger les pinceaux entre les quotes simples et doubles. Donc il faut s'imposer une règle et ne plus en changer, par exemple: php encadre ses chaînes SQL entre simple quotes, et SQL encadre ses chaînes entre double quotes.
Avec cette règle ton exemple précédent donnerai:
$query = 'SELECT * FROM ISSUETASK WHERE title REGEXP "^[ ]?' . $KeyW . '[ ]?"';
Avant toute chose, pour s'assurer qu'un caractère pouvant avoir un sens spécial dans une regex soit échappé de manière à ce qu'il soit vu comme un caractère littéral et pas comme une "commande" spéciale, il faut utiliser la fonction PHP preg_quote qui va se charger de "désactiver" ces caractères spéciaux en les échappant. Exemple preg_quote('Maurice+Berthe=Amour pour toujours'); donnera Maurice\+Berthe\=Amour pour toujours (bien que l'échappement du égal ne sert à rien).
Bref, pour "isoler" $keyW, il y a 2 manières possibles:- soit $keyW commence et se termine par des lettres, des chiffres ou des underscores et là tu peux utiliser des word boundaries (~limites de mot)
- soit ce n'est pas le cas et il faut vérifier la présence d'un espace ou de la limite de la chaîne de part et d'autre.
Donc dans le premier cas:
$query = 'SELECT * FROM ISSUETASK WHERE title REGEXP "[[:<:]]' . preg_quote($KeyW) . '[[:>:]]"';
où [[:<:]] marque une séparation avec à sa droite un caractère qui est une lettre ou un chiffre ou un underscore, et à sa gauche un caractère qui n'en est pas ou le début de la chaîne. [[:>:]] c'est le contraire.
Dans le deuxième cas:
$query = 'SELECT * FROM ISSUETASK WHERE title REGEXP "( |^)' . preg_quote($KeyW) . '( |$)"';
Maintenant une remarque plus générale. Si tu te retrouves à chercher la présence d'un mot-clef à coup de LIKE (déjà pas bien rapides) ou de REGEXP (encore pire) sur je ne sais pas combien de colonnes avec des sous-requêtes en veux-tu en voilà, c'est que quelque chose ne va pas en amont dans la conception de la bdd voire de l'application entière. Je te suggère de prendre un peu de recule pour voir s'il n'y a pas de moyen plus simple pour arriver à tes fins.
Partager