There are 2 arrays of arrays, 1 with cities and 2 with categories:

$cities = array( 'Брестская область' => array( 'Брест', 'Барановичи', 'Береза', 'Ганцевичи', 'Дрогичин' ,'Жабинка' ,'Иваново', 'Ивацевичи', 'Каменец' ,'Кобрин', 'Лунинец', 'Ляховичи', 'Малорита' ,'Пинск', 'Пружаны', 'Столин', 'Брестская область'), 'Витебская область' => array( 'Витебск','Бешенковичи', 'Браслав', 'Верхнедвинск', 'Глубокое', 'Городок', 'Докшицы', 'Дубровно', 'Лепель', 'Лиозно', 'Миоры', 'Орша', 'Полоцк', 'Поставы', 'Россоны', 'Сенно', 'Толочин', 'Ушачи', 'Чашники', 'Шарковщина', 'Шумилино', 'Витебская область'), 'Гомельская область' => array( 'Гомель', 'Брагин', 'Буда-Кошелево', 'Ветка', 'Добруш', 'Ельск', 'Житковичи', 'Жлобин', 'Калинковичи', 'Корма', 'Лельчицы', 'Лоев', 'Мозырь', 'Наровля', 'Октябрьский', 'Петриков', 'Речица', 'Рогачев', 'Светлогорск', 'Хойники', 'Чечерск', 'Гомельская область'), 'Гродненская область' => array( 'Гродно', 'Берестовица', 'Волковыск', 'Вороново', 'Дятлово', 'Зельва', 'Ивье', 'Кореличи', 'Лида', 'Мосты', 'Новогрудок', 'Островец', 'Ошмяны', 'Свислочь', 'Слоним', 'Сморгонь', 'Щучин', 'Гродненская область'), 'Минская область' => array( 'Минск', 'Березино', 'Борисов', 'Вилейка', 'Воложин', 'Дзержинск', 'Жодино', 'Клецк', 'Копыль', 'Крупки', 'Логойск', 'Любань', 'Марьина Горка', 'Молодечно', 'Мядель', 'Несвиж', 'Слуцк', 'Смолевичи', 'Солигорск', 'Старые Дороги', 'Столбцы', 'Узда', 'Червень', 'Минская область'), 'Могилёвская область' => array( 'Могилев', 'Белыничи', 'Бобруйск', 'Быхов', 'Глуск', 'Горки', 'Дрибин', 'Кировск', 'Климовичи', 'Кличев', 'Костюковичи', 'Краснополье', 'Кричев', 'Круглое', 'Мстиславль', 'Осиповичи', 'Славгород', 'Хотимск', 'Чаусы', 'Чериков', 'Шклов', 'Могилёвская область') ); $categors = array( 'Детский мир' => array( 'Детский мир', 'Детская одежда', 'Детская обувь', 'Детские коляски', 'Детские автокресла', 'Детская мебель', 'Игрушки', 'Детский транспорт', 'Товары для кормления', 'Товары для школьников', 'Прочие детские товары'), 'Недвижимость' => array( 'Недвижимость','Аренда квартир','Аренда комнат', 'Аренда домов','Аренда земли','Аренда гаражей / Стоянок', 'Ищу компаньона','Продажа квартир','Продажа комнат', 'Продажа домов', 'Продажа земли','Продажа гаражей / Стоянок', 'Аренда помещений','Продажа помещений','Прочая недвижимость', 'Обмен недвижимости'), 'Транспорт' => array( 'Транспорт','Легковые автомобили','Мото','Автобусы', 'Спецтехника','Грузовые автомобили','Сельхозтехника', 'Водный транспорт','Воздушный транспорт','Запчасти / Аксессуары', 'Прицепы','Другой транспорт','Авто / Мото услуги'), 'Работа' => array( 'Работа','Розничная торговля / Продажи','Транспорт / Логистика', 'Строительство','Бары / Рестораны','Юриспруденция и Бухгалтерия', 'Охрана / Безопасность','Домашний персонал','Красота / Фитнес / Спорт', 'Туризм / Отдых / Развлечения','Образование','Культура / Искусство', 'Медицина / Фармация','ИТ / Телеком / Компьютеры','Недвижимость', 'Маркетинг / Реклама / Дизайн','Производство / Энергетика', 'Cекретариат / АХО','Частичная занятость','Начало карьеры / Студенты', 'Сервис и Быт','Другие сферы занятий'), 'Животные' => array( 'Животные','Собаки','Кошки','Аквариумистика', 'Птицы','Грызуны','Рептилии','Сельхоз животные', 'Животные даром','Зоотовары','Вязка','Бюро находок', 'Другие животные'), 'Дом и Сад' => array( 'Дом и Сад','Канцтовары / Расходные материалы', 'Мебель','Предметы интерьера','Строительство / Ремонт', 'Инструменты','Комнатные Растения','Посуда / Кухонная утварь', 'Садовый Инвентарь','Сад / Огород','Хозяйственный инвентарь / Бытовая химия', 'Прочие товары для дома'), 'Электроника' => array( 'Электроника','Телефоны','Компьютеры', 'Фото / Видео','Тв / Видеотехника','Аудиотехника', 'Игры и Игровые приставки','Техника для дома', 'Техника для кухни','Климатическое оборудование','Индивидуальный уход', 'Аксессуары и комплектующие','Прочая электроника'), 'Услуги / Бизнес' => array( 'Услуги / Бизнес','Строительство / Ремонт / Уборка', 'Финансовые услуги / Партнерство','Перевозки / Аренда транспорта', 'Реклама / Полиграфия / Маркетинг / Интернет','Няни / Сиделки', 'Сырьё / материалы','Красота / Здоровье','Оборудование','Образование / Спорт', 'Услуги для животных','Продажа бизнеса','Развлечение / Искусство / Фото / Видео', 'Туризм / Иммиграция','Услуги переводчиков / Набор текста','Авто / Мото услуги', 'Обслуживание, Ремонт техники','Сетевой маркетинг','Юридические услуги', 'Прокат товаров','Прочие услуги'), 'Мода и Cтиль' => array( 'Мода и Cтиль','Одежда/обувь','Для свадьбы', 'Мода разное','Наручные часы','Аксессуары', 'Подарки','Красота / Здоровье'), 'Хобби, Отдых и Спорт' => array( 'Хобби, Отдых и Спорт','Антиквариат / Коллекции', 'Музыкальные инструменты','Другое','Спорт / Отдых', 'Книги / Журналы','CD / DVD / Пластинки / Кассеты', 'Билеты','Поиск попутчиков','Поиск групп / Музыкантов') ); 

With this code, I make a selection depending on the choice of value in the input:

  if( isset($_GET["city"]) and isset($_GET["categor"]) ) { $city = htmlspecialchars($_GET["city"]); $city = trim ($city); $categor = htmlspecialchars($_GET["categor"]); $categor = trim ($categor); $where = array(); $where[] = "city = '$city'"; $where[] = "categor = '$categor'"; if($city == 'Вся Беларусь' and $categor == 'Все категории') $res = mysqli_query($db, "SELECT * FROM `articles` ORDER BY `article_id` DESC LIMIT 12"); else if($city == 'Вся Беларусь') $res = mysqli_query($db, "SELECT * FROM `articles` WHERE categor IN ('" . implode("','", $categors[$categor]) . "') ORDER BY `article_id` DESC LIMIT 12"); else if($categor == 'Все категории') $res = mysqli_query($db, "SELECT * FROM `articles` WHERE city IN ('" . implode("','", $cities[$city]) . "') ORDER BY `article_id` DESC LIMIT 12"); else if (count($where) > 0 ) { $query = "SELECT * FROM `articles` WHERE " . implode(" AND ", $where) . " ORDER BY `article_id` DESC LIMIT 12"; } else { $query = "SELECT * FROM `articles` ORDER BY `article_id` DESC LIMIT 12"; } $res = mysqli_query($db, $query); } 

The problem is that if I choose not a city but a whole region and / or category, it doesn’t display anything, how can I fix it? Displays only by explicit coincidence, disregarding nesting into an array.

  • Maybe all the same will transfer all directories in the database. it will be much easier to work with them. And the request is only one, instead of choosing from a heap of possible options, simply add additional conditions to it with a given filter - Mike

2 answers 2

I think something like this:

 $where=array("1=1"); if($categor && $categor != 'Все категории') { if(array_key_exists($categor, $categors)) { $where[]="categor IN ('" . implode("','", $categors[$categor]) . "')"; } else { $where[]="categor='$categor'"; } } if($city && $city != 'Вся Беларусь') { if(array_key_exists($city, $cities)) { $where[]="city IN ('" . implode("','", $cities[$city]) . "')"; } else { $where[]="city='$city'"; } } $query = "SELECT * FROM `articles` WHERE " . implode(" AND ", $where) . " ORDER BY `article_id` DESC LIMIT 12"; 

Actually everything. If no filter is specified, the query condition will be "where 1=1" which is always true and is completely equivalent to the absence of where itself.

PS But it is worth transferring reference books to the database and abandoning variable substitution in the query itself (in favor of using bind_param) ...

  • The best) Thank you) - Identin

Judging by the code, there can be no other way, because in SELECT you transfer a maximum of 1 city here:

 $where[] = "city = '$city'"; 

I do not know how your organization is organized; therefore it is difficult to recommend a solution for you. There are several options, for example:

  1. If the region name comes from your input, then from the область-город array, take a list of cities and add them to $where , like this:

     foreach $city in <список_городов_области> { $where[] = "city = '$city'"; } 

    Just keep in mind that cities in the final query should be combined via OR , since you will need to choose either city1 , or city2 , or city3 , etc.

  2. Or organize the form so that when you select a region, a list of cities comes to the script, then you add them to $where in the same way.

PS Now your database code is vulnerable to injection. I recommend to study the question of how to protect against them.