Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск и слэш
 
 автор: tAleks   (23.03.2013 в 18:37)   письмо автору
 
 

Делаю поиск на сайте, и столкнулся с такой ситуацией. Если в запросе добавить слэш, то результат не выдается, даже если это результат есть в БД.

Пример:

$q_string = "Строка \";

В БД есть запись содержащая "Строка \"

Перед запросом обрабатываю так:
$q_string = mysql_real_escape_string(htmlspecialchars($q_string));

В результате $q_string = "Строка \\" (Два слэша)

И в запрос идет так:
articles.title LIKE '%Строка \\%'

Естественно не находит, т.к. в БД - "Строка \" (Один слэш)

Вопрос: Что делать? Не обрабатывать mysql_real_escape_string? - вроде совсем глупо. Как в данном случае правильно сделать запрос?

  Ответить  
 
 автор: cheops   (23.03.2013 в 18:39)   письмо автору
 
   для: tAleks   (23.03.2013 в 18:37)
 

А вы попробуйте использовать внутри запроса не одиночные, а двойные кавычки.

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

  Ответить  
 
 автор: Sfinks   (26.03.2013 в 13:06)   письмо автору
 
   для: tAleks   (23.03.2013 в 18:37)
 

Тут происходит двойное преобразование. Т.е. первое при разборе скрипта PHP-парсером, второе при разборе запроса MySQL-парсером.

Соответственно после первого преобразования в запрос MySQL попадает строка с одним слешем и запрос выглядит уже так:
... WHERE title LIKE '%Строка \%'

После второго разбора MySQL понимает это, как: Надо искать строку '<любые символы>Строка %' т.е. первый знак процента означает любой набор символов, а второй % -это именно символ процента.

Выход 1 - двойное экранирование. Т.е. Если вы напишите
... WHERE title LIKE '%Строка \\\\%'
, то все будет найдено.

Выход 2 - использование ESCAPE-символа:
... WHERE title LIKE '%Строка |\\%' ESCAPE '|'

  Ответить  
 
 автор: tAleks   (29.03.2013 в 16:19)   письмо автору
 
   для: Sfinks   (26.03.2013 в 13:06)
 

>Выход 2 - использование ESCAPE-символа:
... WHERE title LIKE '%Строка |\\%' ESCAPE '|'


Про это можно поподробнее. Что-то я такое первый раз вижу.

  Ответить  
 
 автор: Sfinks   (05.04.2013 в 10:24)   письмо автору
 
   для: tAleks   (29.03.2013 в 16:19)
 

Если коротко - то вы в последних кавычках сами указываете какой символ будет у вас работать в шаблоне оператора LIKE как слеш.
Подробно тут

  Ответить  
 
 автор: Deed   (29.03.2013 в 18:08)   письмо автору
 
   для: tAleks   (23.03.2013 в 18:37)
 

http://lists.mysql.com/mysql/206935

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования