Исходные: есть некая группа чекбоксов, которые передаются с одним именем. Например “Цвета” и чекбоксы: красный, желтый, зеленый.
Пользователь выбрал, например, два цвета. Как правильно прописать код, чтобы в результат выбора из БД выбиралась строка, где в колонке “цвет” указан только один из выбранных пользователем цветов? То есть когда есть частичное совпадение. Передается массив, а в колонке указана только его часть.
В моем случае вместо IN используется LIKE, так как на случай, если ни один чекбокс не выбран (массив пустой), передается величина “%”, чтобы выбирались все цвета. Какой синтаксис возможен в этом случае? И, да, все биндингуется.
Или, может, в корне вопрос можно/нужно решить иначе? Суть: группа чекбоксов должна выбирать из конкретной колонки базы данных строку(строки) по любому совпадению со значением из этой группы чекбоксов. В случае, если ни один чекбокс не проставлен - эта группа чекбоксов должна игнорироваться при выборке (мною это было решено выбором всех строк, независимо от содержимого колонки, через передачу “%”).
Если с LIKE, то это тогда генерировать OR на каждый выбранный элемент ) Ну и LIKE тогда не нужен, можно просто =.
И да, PDO массив не умеет биндить, надо самому что-то такое генерировать php - Can I bind an array to an IN() condition? - Stack Overflow
В более высокоуровневых библиотеках, ORM и т.д. удобнее, можно не париться с генерацией строк самому, а например просто вызывать ->orWhere
в цикле или массив условий передать. php - How to Create Multiple Where Clause Query Using Laravel Eloquent? - Stack Overflow
Если с LIKE, то это тогда генерировать OR на каждый выбранный элемент ) Ну и LIKE тогда не нужен, можно просто =.
То есть на каждый цвет (на каждый чекбокс) повесить свое имя и через OR перебрать?
И, если я правильно понимаю, сразу следующий вопрос: почему, если одиночный чекбокс не выбран, это блокирует работу всей формы (в которой есть еще другие поля ввода - например, выпадающие списки)? Если одиночный чекбокс не выбран - форма не работает вообще, ничего не выводит, хотя, казалось бы, должна просто игнорировать этот параметр.
Не обязательно свое имя, можно и просто имея массив значений OR для каждого сгенерировать, ну или точнее лучше IN, и пропустить часть для этой группы если в ней ничего. То есть для всех групп будет WHERE color IN (...) AND somethingelse IN (...) AND ...
, и если нет цветов, то WHERE somethingelse IN (...) AND ...
хз, видимо что-то не так в коде )