- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Доброго времени суток!
Уважаемые PHPшники и в этом понимающие, подскажите решение задачи.
Делаю простенький фильтр по товарам и забуксовал на месте при встрече с одной проблемой. Нужна возможность выбора двух значений, в данном случае, двух вариантов цвета. Есть код HTML формы:
И сам ПХП код:
Вид MySQL таблицы
name -------- color ------- wifi --- bluetooth --- price
Товар 1 ---- Бежевый ---- 1 ----------- 1
Товар 2 ---- Серый ------- 1 ----------- 0
Товар 3 ---- Красный ---- 0 ----------- 1
Так вот, все, вроде ОК, но это на первый взгляд. Т.е., если отмечаем чекбоксы разных категорий, например, "Wi-Fi" и "серый", то получаем рабочий запрос вида:
SELECT * FROM `table` WHERE `wifi` = '1' AND `color` = 'серый';
Но, если отметим 2 варианта цвета, то получаем такой вот нерабочий запрос:
SELECT * FROM `tovar` WHERE `color` = 'серый' AND `color` = 'бежевый'
И,собственно, вопрос: как можно выйти из этой ситуации и можно ли это исправить в рабочий вариант или же надо что-то другое думать?
Как я понимаю, рабочий запрос должен быть такого вида
$sql = "SELECT * FROM `tovar` WHERE `wifi` = '1' AND (color='серый' OR color='бежевый')";
или такой
$sql = "SELECT * FROM `tovar` WHERE color IN ('серый','бежевый') AND `wifi` = '1'";
И сам внешний вид фильтра
P.S. Сильно не пинайте, пока что только начинаю изучать ПХП и, как обычно, сразу на практике.
Если одинаковые поля, OR, а если разные, AND.
??? Может, все-таки `category`=1 или `category`='wifi' ?---------- Добавлено 18.02.2019 в 13:39 ----------
IN – это то же самое, что и (множественный) OR. В случае OR не забываем, что у него приоритет ниже, чем AND, поэтому берем в скобки. Тут все верно.
---------- Добавлено 18.02.2019 в 13:44 ----------
---------- Добавлено 18.02.2019 в 13:47 ----------
Когда уже вы перестанете использовать расширение mysql? Используйте хотя бы mysqli.
---------- Добавлено 18.02.2019 в 13:51 ----------
Учитесь отделять код запросов от шаблонов, не делать полноценный вывод в ответ на POST и т.п.
Чтобы на этом форуме нормально отображался код, используйте просто CODE.
Если одинаковые поля, OR, а если разные, AND.
---------- Добавлено 18.02.2019 в 13:39 ----------
IN – это то же самое, что и (множественный) OR. В случае OR не забываем, что у него приоритет ниже, чем AND, поэтому берем в скобки. Тут все верно.
Так в том-то и вопрос, что в данном коде ставится AND и при разных полях, и при одинаковых. Это и надо как-то исправить, а своих мозгов пока не хватает...
??? Может, все-таки `category`=1 или `category`='wifi' ?
А чем `wifi` = '1' не устраивает? Тоже самое, что и `category`='wifi'. 1 - есть Wi-Fi, 0 - нет.
Чтобы на этом форуме нормально отображался код, используйте просто CODE.
Поправил.
А чем `wifi` = '1' не устраивает? Тоже самое, что и `category`='wifi'. 1 - есть Wi-Fi, 0 - нет.
Я думал, это категория. Нужно лучше объяснять, а то пока, судя по форме, это у вас цвет такой :) Чтобы было понятнее, что это отдельный признак, формализуйте описание исходных данных, тогда уже можно будет отвечать на вопросы вроде
---------- Добавлено 18.02.2019 в 15:31 ----------
P.S. Если вы таким экзотическим образом пытались изобразить принадлежность одновременно к нескольким категориям, почитайте про связывание «многие-ко-многим» ;)
Это и надо как-то исправить
Правьте код, вводите для выбора цвета свою функцию, дополнительно к функции addWhere.
Доброго времени суток!
Уважаемые PHPшники и в этом понимающие, подскажите решение задачи.
Делаю простенький фильтр по товарам и забуксовал на месте при встрече с одной проблемой. Нужна возможность выбора двух значений, в данном случае, двух вариантов цвета. Есть код HTML формы:
И сам ПХП код:
Вид MySQL таблицы
name -------- color ------- wifi --- bluetooth --- price
Товар 1 ---- Бежевый ---- 1 ----------- 1
Товар 2 ---- Серый ------- 1 ----------- 0
Товар 3 ---- Красный ---- 0 ----------- 1
Так вот, все, вроде ОК, но это на первый взгляд. Т.е., если отмечаем чекбоксы разных категорий, например, "Wi-Fi" и "серый", то получаем рабочий запрос вида:
SELECT * FROM `table` WHERE `wifi` = '1' AND `color` = 'серый';
Но, если отметим 2 варианта цвета, то получаем такой вот нерабочий запрос:
SELECT * FROM `tovar` WHERE `color` = 'серый' AND `color` = 'бежевый'
И,собственно, вопрос: как можно выйти из этой ситуации и можно ли это исправить в рабочий вариант или же надо что-то другое думать?
Как я понимаю, рабочий запрос должен быть такого вида
$sql = "SELECT * FROM `tovar` WHERE `wifi` = '1' AND (color='серый' OR color='бежевый')";
или такой
$sql = "SELECT * FROM `tovar` WHERE color IN ('серый','бежевый') AND `wifi` = '1'";
И сам внешний вид фильтра
P.S. Сильно не пинайте, пока что только начинаю изучать ПХП и, как обычно, сразу на практике.
1. Используйте PDO.
2. Забудьте про if ($and) $where .= " AND $add";, используйте функциональное программирование.
3. Как с вами связаться (скайп/телега)?
используйте функциональное программирование
Не забивай человеку голову всяким хламом.
Правьте код, вводите для выбора цвета свою функцию, дополнительно к функции addWhere.
Спасибо за направление. Отчасти помогло, но еще пока не совсем.
Добился чтобы на выходе был запрос вида
$sql = "SELECT * FROM `tovar` WHERE `wifi` = '1' (color='серый' OR color='бежевый')";
Теперь думаю как вот сюда AND вставить... И проблема будет решена.
$sql = "SELECT * FROM `tovar` WHERE `wifi` = '1' AND (color='серый' OR color='бежевый')";
---------- Добавлено 18.02.2019 в 21:06 ----------
1. Используйте PDO.
2. Забудьте про if ($and) $where .= " AND $add";, используйте функциональное программирование.
Только в посте я написал, что с PHP b программированием пока на "Ваше Высочество, разрешите обратиться" :) Поэтому начинаю с примитивных задач, которые не так уж и просты для меня. Но все еще впереди.
Теперь думаю как вот сюда AND вставить...
Да хоть так же. Меня больше интересует, как должны работать логические поля, на пересечение или объединение. Как я понял, это большая тайна, иначе бы вы не держали в неведении старающихся вам помочь :) Впрочем уже пофиг. Вот вам универсальный вариант, нужную связку добавьте сами:
Угу. Очередной костыль увидит свет :D
---------- Добавлено 19.02.2019 в 08:34 ----------
P.S. Для тех, кто в танке...
Данные берутся из «словарей» в БД:
Фактические данные не хранятся в коде. Формы тоже строятся на основе данных из БД. По этим же данным можно фильтровать и ввод, например:
Чтобы не возиться с кавычками у элементов $reqlogic, можно потом сделать так:
Всем большое спасибо за помощь. В итоге разобрался я таки с ним.
В итоге цвет сделал через массив
И дальше через implode
И все заработало!
Ну т.е. танк оказался непрошибаемым – все захардкодили :)
В итоге цвет сделал через массив
Это на большого любителя, под конкретный язык и т.д. А показанный мной вариант с разными именами контроллов вполне стандартный.