Noxter Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 Этот код выводит все товары по любому запросу N (?hren[]=N)Потому что вам нужно использовать оператор IN (?@). Вы не читаете что вам пишут, ищите готовое решение которого нет. Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 24 января, 2018 Автор Жалоба Поделиться Опубликовано 24 января, 2018 Потому что вам нужно использовать оператор IN (?@).Вы не читаете что вам пишут, ищите готовое решение которого нет. Вы даже не представляете, сколько я перепробовал, вчера до 7-ми утра со дня, и сегодня весь день. Так что я не ищу готового решения, но и само собой - не отказался-бы Я ищу помощи опытных людей. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 Я ищу помощи опытных людей.Вам её выше предоставили, вы не внимательный наверное. Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 24 января, 2018 Автор Жалоба Поделиться Опубликовано 24 января, 2018 Вам её выше предоставили, вы не внимательный наверное. IN (?@). - не ищет в перечни значений ячейки через запятую Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 IN (?@). - не ищет в перечни значений ячейки через запятуюПотому что ЭТО СТРОКА! Приведите её к массиву и будет вам счастье, я вам выше ссылку дал на мануал. Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 24 января, 2018 Автор Жалоба Поделиться Опубликовано 24 января, 2018 Потому что ЭТО СТРОКА! Приведите её к массиву и будет вам счастье, я вам выше ссылку дал на мануал.Привести строку mysql в массив и по ней отфильтровать?...Было уже подобное, искало опять-же один раз, но при mobili?hren[]=20&hren[]=150 - выводит товар, в перечни поля hren которого есть 150, а товар где есть 20 - не выводится. Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 Потому что я вам дал не ГОТОВОЕ решение - а один из вариантовЧтобы работало как вы хотите, нужно у первого писать AND а у остальных ORНо я не собираюсь делать это все за васА про приведение строки к массиву - БРЕД, потому как все происходит в MySQL? а не в пыхе...IN (?@). - не ищет в перечни значений ячейки через запятуюFIND_IN_SET как раз отлично ищет. Только надо подумать немного, а не ждать готового. Цитата Ссылка на сообщение Поделиться на другие сайты
a13x Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 (изменено) Ответь честно ты долбоёб по жизни или с недавних пор?Мне 29 лет, какой нахер школьник? Что ты несёшь идиотище?А по поводу операторов пойди и сам почитай что каждый из них делает, я эту матчасть ужа давно изучил.Ну ты и сказочный долбоёб т.к. к 30 годам не научился нормально общаться. Задрот компьютерный который строит из себя программиста, а по факту чмо, которое запрос не может построить. Выучил симплу, копирует код и вставляет в другие места выдавая себя за ахиренно крутого прогера. Понятие школьник значит что ты олень, а не именно "школьник", но вобще математику тебе стоило бы подучить. Если я тебя попрошу построить запрос на нативном mysql ты нихера его не сможешь построить т.к. привык работать с симпловым placehold и понятия не имеешь чем отличается ID IN и LIKE Блин, причем тут serialize или json_encode??Вы вообще понимаете, о чем разговор? Чем вам это поможет, если надо сделать все в одном запросе? В MySQL? а не в ПХП...Пробуйте сначала читать, а потом уже отвечать.Притом что для поиска по строке используется LIKE или оператор =, всякие FIND_IN_SET возвращают только позицию вхождения в строку. Я даже примерно не могу понять где это может быть нужно, но если вы сделали, то вам виднее. Вобще считаю полной глупостью делать такие вещи в mysql, т.к. для этого существует strpos в пхп, а заменить стандартный LIKE на FIND_IN_SET вобще жесть, но дело ваше. Каждый программирует так как умеет. Noxter вон вобще програмер от бога Изменено 24 января, 2018 пользователем a13x Цитата Ссылка на сообщение Поделиться на другие сайты
a13x Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 К автору: if(!empty($filter['hren'])) { $intest = array($filter['hren']); print_r($intest); $hren_filter = $this->db->placehold("AND (pv.hren LIKE '%,$intest,%' OR pv.hren LIKE '%,$intest' OR pv.hren LIKE '$intest,%')"); $variant_join = 'LEFT JOIN __variants pv ON pv.product_id = p.id'; } В этом коде вы обернули массив дважды. $intest = $filter['hren']; Вот так надо. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 К автору: if(!empty($filter['hren'])) { $intest = array($filter['hren']); print_r($intest); $hren_filter = $this->db->placehold("AND (pv.hren LIKE '%,$intest,%' OR pv.hren LIKE '%,$intest' OR pv.hren LIKE '$intest,%')"); $variant_join = 'LEFT JOIN __variants pv ON pv.product_id = p.id'; } В этом коде вы обернули массив дважды. $intest = $filter['hren']; Вот так надо.Пшла нахуй шавка недоношенная Цитата Ссылка на сообщение Поделиться на другие сайты
a13x Опубликовано 24 января, 2018 Жалоба Поделиться Опубликовано 24 января, 2018 Закукарекал петушок Цитата Ссылка на сообщение Поделиться на другие сайты
Решение yr4ik Опубликовано 24 января, 2018 Решение Жалоба Поделиться Опубликовано 24 января, 2018 (изменено) Притом что для поиска по строке используется LIKE или оператор =, всякие FIND_IN_SET возвращают только позицию вхождения в строку. Я даже примерно не могу понять где это может быть нужно, но если вы сделали, то вам виднее. Вобще считаю полной глупостью делать такие вещи в mysql, т.к. для этого существует strpos в пхп, а заменить стандартный LIKE на FIND_IN_SET вобще жесть, но дело ваше. Каждый программирует так как умеет. Noxter вон вобще програмер от бога Ну я думаю тут вся проблема в том что ТС не выразил толком свою мысль, а начал писать коды в которых мало что понимает. Теперь каждый интерпретирует это по своему. Насколько я понял - то он создал в вариантах текстовое поле в котором перечисляет какие то цифровые идентификаторы (допустим 1,2,4,10).Далее он через GET передает массив этих идентификаторов (допустим 2 и 1) и хочет отфильтровать по этому критерию варианты. Исходя из этого: IN тут - никак не поможет. Потому что выборка будет успешной только если передать целую строку hren IN ("1,2,4,10")LIKE - можно. Но если поле hren = "99,88", а в запросе придет просто 9 - то нужно делать условие WHERE (hren='9' OR hren LIKE '%,9,%' OR hren LIKE '%,9' OR hren LIKE '9,%') Я ж вижу эту реализацию - только через регулярку с границей слова или FIND_IN_SET (как по мне практичней). SELECT * FROM table WHERE FIND_IN_SET('9', hren) > 0 UPD: Перечитав тему понял наконец что он хочет $hren_filter = ''; if(!empty($filter['hren'])) { $intest = array(); foreach((array) $filter['hren'] as $hren) $intest[]= $this->db->placehold("FIND_IN_SET(?, pv.hren)", $hren); $hren_filter = $this->db->placehold(" AND p.id IN (SELECT DISTINCT pv.product_id FROM __variants pv WHERE pv.product_id=p.id AND (".implode(' OR ', $intest)."))"); } могут быть опечатки. Переменную $hren_filter нужно добавить в основной запрос на выборку товаров Изменено 25 января, 2018 пользователем yr4ik Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 25 января, 2018 Автор Жалоба Поделиться Опубликовано 25 января, 2018 yr4ik, спасибо вам большое. Именно то, что нужно. Мне до такого еще учиться и учиться, сам-бы не сообразил это точно)) Еще раз - спасибо! Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 25 января, 2018 Жалоба Поделиться Опубликовано 25 января, 2018 Правильно FIND_IN_SET возвращает позицию вхождения Есть вхождение - возвращает, нет вхождения - не возвращает...А LIKE по-вашему что делает? Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 25 января, 2018 Автор Жалоба Поделиться Опубликовано 25 января, 2018 А можно-ли как-то произвести удаление конкретного значения из поля $variant->hren (тут уже инфы даже близко в интернете не нашел).. Есть вот такая функция public function delete_hren($id) { if(!empty($id)) { $query = $this->db->placehold("DELETE FROM __hrens WHERE id=? LIMIT 1", intval($id)); return $this->db->query($query); } } (функционал аналог label'ов в orders), там если удаляем лейбл то он удаляется во всех заказах такой строкой в аналогичной функции: $query = $this->db->placehold("DELETE FROM __orders_labels WHERE label_id=?", intval($id)); Но там строка, а тут ячейка с перечнем через запятую. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 25 января, 2018 Жалоба Поделиться Опубликовано 25 января, 2018 можно. Лучше бы конечно организовать это все по нормальному через таблицу. Ну я думаю вам это бесплатно никто не опишет как делать, а сами не сможете... $this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren)); Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 25 января, 2018 Автор Жалоба Поделиться Опубликовано 25 января, 2018 можно. Лучше бы конечно организовать это все по нормальному через таблицу. Ну я думаю вам это бесплатно никто не опишет как делать, а сами не сможете... $this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren)); Да, я вчера старался и впринцепи все сделал, создал таблицу s_hren где хранились значения, сортировка и т.д. создал таблицу s_variants_hren где хреням назначался вариант, все это занес в движок, записи в бд создавались НО если я в api/Variants.php изменял запрос на $query = $this->db->placehold("SELECT v.id, v.product_id, v.price, NULLIF(v.compare_price, 0) as compare_price, v.sku, IFNULL(v.stock, ?) as stock, (v.stock IS NULL) as infinity, v.name, v.color, v.hrens, v.attachment, v.position FROM __variants AS v LEFT JOIN __variants_hrens AS vh ON v.id=vh.variant_id WHERE 1 $product_id_filter $variant_id_filter $instock_filter $hren_filter ORDER BY v.position ", $this->settings->max_order_amount); то в товарах начинали происходить чудеса......(сколько строк в variants_hrens к данному варианту добавлено - столько в админке самих вариантов (клонов) и выводилось) Цитата Ссылка на сообщение Поделиться на другие сайты
Плохиш Опубликовано 26 января, 2018 Жалоба Поделиться Опубликовано 26 января, 2018 Нет тут никаких чудес. Выводится в соответствии с правилами SQL, PHP и прочих программистских технологий.А то, что не показывает так, как Вы хотите - это совсем не чудо.Если собираетесь работать и дальше методом тыка, то таких "чудес" еще много можете встретить. Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 26 января, 2018 Автор Жалоба Поделиться Опубликовано 26 января, 2018 Нет тут никаких чудес. Выводится в соответствии с правилами SQL, PHP и прочих программистских технологий.А то, что не показывает так, как Вы хотите - это совсем не чудо.Если собираетесь работать и дальше методом тыка, то таких "чудес" еще много можете встретить. Хех, ага Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 26 января, 2018 Жалоба Поделиться Опубликовано 26 января, 2018 Нет тут никаких чудес. Выводится в соответствии с правилами SQL, PHP и прочих программистских технологий.А то, что не показывает так, как Вы хотите - это совсем не чудо.Если собираетесь работать и дальше методом тыка, то таких "чудес" еще много можете встретить.+1 Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 26 января, 2018 Автор Жалоба Поделиться Опубликовано 26 января, 2018 можно. Лучше бы конечно организовать это все по нормальному через таблицу. Ну я думаю вам это бесплатно никто не опишет как делать, а сами не сможете... $this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren)); Не работает код Выдает ошибку: Warning: Placeholder substitution error. Diagnostics: "UPDATE s_variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(UNKNOWN_PLACEHOLDER_1, hren)" Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 26 января, 2018 Жалоба Поделиться Опубликовано 26 января, 2018 Не работает код Выдает ошибку: Warning: Placeholder substitution error. Diagnostics: "UPDATE s_variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(UNKNOWN_PLACEHOLDER_1, hren)" $this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren), intval($delete_hren)); Цитата Ссылка на сообщение Поделиться на другие сайты
core Опубликовано 26 января, 2018 Автор Жалоба Поделиться Опубликовано 26 января, 2018 $this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren), intval($delete_hren)); Очень благодарю, все получилось. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.