Ваша основная проблема - это проблема логического приоритета. Вы генерируете предложение where
, например:
WHERE brand = ? AND category = ? OR category = ?
Поскольку AND
имеет более высокий приоритет, чем AND
, это фактически означает:
WHERE (brand = ? AND category = ?) OR category = ?
Это принимает строки, чьи категории соответствуют параметр второй категории, независимо от их бренда.
Вам нужны круглые скобки, чтобы контролировать преимущество:
WHERE brand = ? AND (category = ? OR category = ?)
Это можно сократить с помощью IN
:
WHERE brand = ? AND category IN (?, ?)
Но суть в том, что я не вижу смысла перебирать бренды в php, извлекать все строки и затем считать их. Ваша база данных может намного эффективнее управлять наборами строк с помощью запроса агрегации.
Что-то вроде этого должно быть близко к тому, что вам нужно:
select brand, count(*) no_products
from products
group by brand
where category in (?, ?)
Обратите внимание, что все вышеперечисленные запросы параметризованный (ie параметры не объединяются в строке запроса, а вместо этого передаются в запрос в execute
время). Вы делаете хотите использовать эту технику, чтобы сделать ваш код более эффективным и предотвратить SQL внедрение.