Поиск по шаблону с MySQL - PullRequest
0 голосов
/ 26 ноября 2011

У меня есть ситуация, когда мой поиск по шаблону не работает так, как я думал , что должен ... Это мой запрос MySQL, и он будет возвращать только целые слова ...

например.Если я введу «телефон» в качестве поискового слова, оно вернет все строки с «телефоном», но не строки с «телефонами» (обратите внимание на добавленные «s»)

mysql_query(" SELECT * FROM posts WHERE permalink = '$permalink' AND LOWER(raw_text) LIKE '%$str%' " );

Как я могу его получитьвернуть все варианты искомого слова?Очевидно, я знаю, что это может привести к проблемам, так как это может вернуть все виды совпадений, если пользователь введет обычный набор букв, я подумал, что мог бы сделать эту часть расширенного поиска.

ADENDUM Я сузил это до проблемы не с подстановочным знаком, а с тем, что я делаю с возвращенными данными ... Именно в моем регулярном выражении я добавляю данные.

$pattern= "/(?:[\w\"',.-]+\s*){0,5}[\"',.-]?\S*".$str."(\s|[,.!?])(\s*[A-Za-z0-9.,-]+){0,5}/";

preg_match_all($pattern, $row["raw_text"], $matches);

Регулярное выражение не находит строку в необработанных данных, которые я возвращаю, поэтому оно дает мне нулевое значение.Новая проблема, я не очень знаком с регулярными выражениями, поэтому я буду вынужден спорить с этим тоже ... Может быть, я скоро подниму новый вопрос!

Спасибо, M

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Я думаю, что-то еще происходит.Часть % запроса кажется правильной.И это, кажется, подтверждение:

select 'phones' LIKE '%phone%';
+-------------------------+
| 'phones' LIKE '%phone%' |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

Кстати, я действительно надеюсь, что вы проводите строгую санитарию на $str$permalink тоже, если это из пользовательского ввода).Вам следует разрешить только буквенно-цифровые символы и небольшое количество других безопасных символов (возможно, пробелов), и вы должны пропустить его через mysql_real_escape_string(), прежде чем использовать его в mysql_query().А еще лучше взглянуть на PDO.

В любом случае, вернемся к устранению неисправностей: одна вещь, которую можно попробовать, - это заставить программу записать в строку, которую вы посылаете на mysql_query().По сути, измените вызов mysql_query () на вызов error_log() или echo() или что-то в этом роде.Затем скопируйте и вставьте полученный запрос в инструмент командной строки MySQL или PHPmyAdmin или что-то еще.Когда этот запрос не работает так, как вы ожидаете, по крайней мере, вы можете посмотреть на него и настроить его, чтобы выяснить, в чем дело.И кто знает, может быть, это станет супер-очевидным, когда вы увидите, как сформулирован запрос.

0 голосов
/ 26 ноября 2011

Я подозреваю, что в вашей переменной $str есть пробел, который объясняет то, что вы видите: ваш критерий LIKE будет '%phone %', что соответствует "... phone ...", но не "... phones ...".

Попробуйте сначала подрезать свое значение.

...