|
|
|
| Делаю поиск на сайте, и столкнулся с такой ситуацией. Если в запросе добавить слэш, то результат не выдается, даже если это результат есть в БД.
Пример:
$q_string = "Строка \";
В БД есть запись содержащая "Строка \"
Перед запросом обрабатываю так:
$q_string = mysql_real_escape_string(htmlspecialchars($q_string));
В результате $q_string = "Строка \\" (Два слэша)
И в запрос идет так:
articles.title LIKE '%Строка \\%'
Естественно не находит, т.к. в БД - "Строка \" (Один слэш)
Вопрос: Что делать? Не обрабатывать mysql_real_escape_string? - вроде совсем глупо. Как в данном случае правильно сделать запрос? | |
|
|
|
|
|
|
|
для: tAleks
(23.03.2013 в 18:37)
| | А вы попробуйте использовать внутри запроса не одиночные, а двойные кавычки.
Вообще при использовании регулярных выражений внутри строк начинается тихий ужас, именно, поэтому большинство языков программирования стараются предоставить возможность использования их в обход строк. К сожалению, к PHP и MySQL это не относится. | |
|
|
|
|
|
|
|
для: tAleks
(23.03.2013 в 18:37)
| | Тут происходит двойное преобразование. Т.е. первое при разборе скрипта PHP-парсером, второе при разборе запроса MySQL-парсером.
Соответственно после первого преобразования в запрос MySQL попадает строка с одним слешем и запрос выглядит уже так:
... WHERE title LIKE '%Строка \%'
|
После второго разбора MySQL понимает это, как: Надо искать строку '<любые символы>Строка %' т.е. первый знак процента означает любой набор символов, а второй % -это именно символ процента.
Выход 1 - двойное экранирование. Т.е. Если вы напишите
... WHERE title LIKE '%Строка \\\\%'
| , то все будет найдено.
Выход 2 - использование ESCAPE-символа:
... WHERE title LIKE '%Строка |\\%' ESCAPE '|'
|
| |
|
|
|
|
|
|
|
для: Sfinks
(26.03.2013 в 13:06)
| | >Выход 2 - использование ESCAPE-символа:
... WHERE title LIKE '%Строка |\\%' ESCAPE '|'
|
Про это можно поподробнее. Что-то я такое первый раз вижу. | |
|
|
|
|
|
|
|
для: tAleks
(29.03.2013 в 16:19)
| | Если коротко - то вы в последних кавычках сами указываете какой символ будет у вас работать в шаблоне оператора LIKE как слеш.
Подробно тут | |
|
|
|
|