Мне нужно выяснить, как запросить мою базу данных для 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
, не будут найдены, потому что символы регулярных выражений остаются незанятыми.
Я очень ценю любые отзывы об улучшении этого вопроса - я попытался объяснить это как можно яснее, но сложность контекста и ограничений затрудняет его. Спасибо.
Побег подстрок, а не окончательное регулярное выражение.
"(" . preg_quote(serialA) . "|" . preg_quote(serialB) . "|" . preg_quote(serialC) . ")"
know
получил ли он$serial
из переменнойGET
или со страницы, в которой он находится - но я могу просто назначить$serial
с помощьюpreg_quote($_GET[Serial])
- чтобы он мог эффективно «знать». D'о. Спасибо!