слеши в like. объясните дураку.

Фанат

oncle terrible
Команда форума
слеши в like. объясните дураку.

Все знают, что на старости лет я для себя открыл вот этот текст:
double any '\'
как я это понимаю?
вот мы ищем, допустим, кавычку. Сравнением.
тут всё просто - прослешиваем эту кавычку и имеем запрос
SELECT * FROM test WHERE ttt = '\'';
находит.

теперь хотим подставить в лайк.
если я правильно понимаю это double any '\', то тупо УДВАИВАЮ слеш и получаю
SELECT * FROM test WHERE ttt like '\\'';
и ошибку в запросе.
совершенно законную.

то есть, получается, что фразу "дублировать все слеши" следует понимать, как дублировать эскейпинг?
то есть, для лайка надо просто повторно залудить mysql_real_escape_string?
 

confguru

ExAdmin
Команда форума
Если хочешь искать \ то в запросе должно быть \\\\,
так как парсер удаляет и оставляет \\, и уже в самом
паттерне (LIKE) \\ считается как ескейленый \
И все работает.
 

confguru

ExAdmin
Команда форума
Речь идет про поиск \ в базе, задача весьма редкая.
' ищется стандартно.
 

Фанат

oncle terrible
Команда форума
то есть, получается, что любой слеш в запросе надо удвоить, а потом строку искейпить?
сейчас попробую
 

confguru

ExAdmin
Команда форума
Фанат

Только в том случае если ищешь именно \

P.S. Эксперимент дешевле расчетов :)
 

Сергей123

Новичок
Я, например, до недавнего времени использовал
PHP:
function mysql_real_escape_string_AND_WILDCARDS($strUnescaped) {
/*
    Usage:
    mysql_query('
        SELECT f FROM t WHERE n LIKE "%' . mysql_real_escape_string_AND_WILDCARDS($str) . '%"
    ')
*/
    $strReturn = $strUnescaped;

    $b = '\\'; # escape-symbol

    # "backslash" escaping
    $strReturn = str_replace('\\', $b.'\\', $strReturn);

    # wildcards escaping
    $strReturn = str_replace(
        array (   '_',    '%'),
        array ($b.'_', $b.'%'),
        $strReturn
    );

    # usual escaping
    $strReturn = mysql_real_escape_string($strReturn);

    return $strReturn;

} # function
В связи с теперешним шумом засомневался... Найду время - пересмотрю "шум".
 

Фанат

oncle terrible
Команда форума
ага, спасибо.
вся проблема была в том, что я удваивал не до mysql_real_escape_string, а после.

-~{}~ 29.09.05 10:45:

admin
Только в том случае если ищешь именно \
ну правильно.
если в строке для поиска есть слеши - то и получается, что ищу именно их.

-~{}~ 29.09.05 13:18:

Балин, всё равно косяк.
хотел написать функцию
PHP:
function escape_like($var,$chars='') { 
  $chars.="\\";
  return addCslashes($var, $chars);
}
а после неё делать искейп стринг.
не получается.
в результате из _ получается \\_ и ничего не находит.

то есть, делать надо в таком порядке:
PHP:
str_replace('\\','\\\\',$var);
mysql_real_escape_string($var);
/*если надо*/ addCslashes($var, '_%');
и только в таком.

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

в случае с плейсхолдерами же я вообще не представляю, как действовать.
 

confguru

ExAdmin
Команда форума
Я бы вырезал из строка поиска все лишнее :)

Если уж так приперло, то проверять есть ли \ в изначальной строке поиска и обрабатывать нестандартно, как описано в мане по MySQL - как вариант - разбить строку по слешу(ам),
потом грамотно склеить перед запросом в LIKE.
 
Сверху