Как я могу использовать RLIKE для эффективного объединения символов LIKE и IN, * и * escape regex, где это необходимо?

0

Мне нужно выяснить, как запросить мою базу данных для Serial A или Serial B или Serial C, однако существует множество ограничений, затрудняющих навигацию.

Предыдущее решение использовало LIKE (например, SELECT * FROM Table WHERE Serial LIKE) - это хорошо работало для поиска всех серий (%) или определенного серийного номера (Serial A). Тем не менее, я быстро обнаружил, что IN и LIKE не могут быть объединены в MySql и что подстановочные знаки, используемые LIKE, недостаточно гибки, чтобы найти Serial A или Serial B или Serial C.

(Примечание: фактические сериалы имеют большое разнообразие и не имеют согласованного соглашения - я знаю, что сериалы, такие простые, как эти основные примеры, можно найти с помощью шаблона %)

Я сразу подумал, что вместо этого нужно использовать RLIKE однако некоторые из сериалов называются такими вещами, как B + 3, и их невозможно найти без экранирования. Здесь я думал использовать метод, чтобы избежать символов, таких как preg_quote() - однако в нем больше проблем со структурой системы...


Выбрать модуль ограничений

Комбобокс заполняется запросом базы данных (например, SELECT DISTINCT Serial FROM Table), из которого пользователи могут выбрать серию, а затем отправить форму. Выбранный серийный номер передается как значение GET на следующую страницу.

Модуль просмотра результатов

Содержимое переменной $serial передается как параметр SQL-запроса для получения результатов на странице. $serial либо заселены странице модуля Просмотр результатов является частью, или по GET значение, переданное на страницу (если значение не заселена страницы до того, как модуль include d и нет GET значение, ошибка будет выброшена).


Эта структура меня немного сбивает с толку. Похоже, что было бы довольно просто использовать RLIKE и preg_quote() для поиска сериала, если это было передано пользователем. preg_quote() может использоваться в $serial перед передачей в качестве параметра, и обновленный запрос (WHERE Serial RLIKE) должен работать WHERE Serial RLIKE образом. Тем не менее, я до сих пор не могу понять, как искать несколько серий.

Если я укажу $serial как (Serial A | Serial B | Serial C) то preg_quote() выйдет из символов регулярного выражения и не найдет их. Но если я не использую preg_quote(), сериалы, такие как B + 3, не будут найдены, потому что символы регулярных выражений остаются незанятыми.


Я очень ценю любые отзывы об улучшении этого вопроса - я попытался объяснить это как можно яснее, но сложность контекста и ограничений затрудняет его. Спасибо.

Теги:
get

1 ответ

1
Лучший ответ

Побег подстрок, а не окончательное регулярное выражение.

"(" . preg_quote(serialA) . "|" . preg_quote(serialB) . "|" . preg_quote(serialC) . ")"
  • 0
    Хммм ... Я собирался сказать, что не могу этого сделать, потому что модуль не know получил ли он $serial из переменной GET или со страницы, в которой он находится - но я могу просто назначить $serial с помощью preg_quote($_GET[Serial]) - чтобы он мог эффективно «знать». D'о. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню