#php #mysql
#php #mysql
Вопрос:
Я пытаюсь использовать функцию MySQL UNHEX() с оператором LIKE, но я не могу получить ожидаемый результат as $result_2_expected
.
Что я делаю не так?
Я пробую способы, описанные ниже, все безуспешно:
- КАК UNHEX(‘B72756365%’)
- НАПРИМЕР, ‘%UNHEX(‘4272756365′)%’
- НАПРИМЕР, ‘%UNHEX(4272756365)%’
Опыт работы с оператором Equal (успех):
$name_1 = bin2hex("Bruce Wayne"); //4272756365205761796e65
$query_1 = "SELECT `NAME` FROM `USERS_TABLE` WHERE `NAME` = UNHEX('{$name_1}')"; // UNHEX('4272756365205761796e65')
$result_1 = [0][NAME] => "Bruce Wayne"; // Success
Опыт работы с оператором LIKE (сбой):
$name_2 = bin2hex("Bruce"); // 4272756365
$query_2 = "SELECT `NAME` FROM `USERS_TABLE` WHERE `NAME` LIKE UNHEX('%{$name_2}%')"; // UNHEX('B72756365%')
$result_2 = [] => null; // Fail
$result_2_expected = [0][NAME] => "Bruce Wayne"; [1][NAME] => "Bruce Willis"; [2][NAME] => "Bruce Springsteen"; // Expected as Success
Комментарии:
1. Замените знаки процента их шестнадцатеричным представлением.
2. Работает хорошо. Спасибо
Ответ №1:
Ваша проблема в том, что вы ввели подстановочные знаки в вызов UNHEX
вместо того, чтобы объединять их вне его, и это приводит UNHEX
к возврату NULL
, который всегда будет вызывать LIKE
возврат false
.
Изменить
LIKE UNHEX('%{$name_2}%')
Для
LIKE CONCAT('%', UNHEX('{$name_2}'), '%')
и ваш код будет работать так, как ожидалось. В качестве альтернативы, вы могли бы поступить так, как предложил @Akina в комментариях, и заменить %
знаки в вызове на UNHEX
их шестнадцатеричное представление ( 25
) и заменить ваш код на
LIKE UNHEX('25{$name_2}25')
Комментарии:
1. Работает с обоими решениями. Спасибо