Перейти к содержанию
Официальный форум поддержки Simpla

Помогите пожалуйста в выводом значений массива в фильтре


Перейти к решению Решено yr4ik,

Рекомендуемые сообщения

Этот код выводит все товары по любому запросу N (?hren[]=N)

Потому что вам нужно использовать оператор IN (?@).

Вы не читаете что вам пишут, ищите готовое решение которого нет.

Ссылка на сообщение
Поделиться на другие сайты

Потому что вам нужно использовать оператор IN (?@).

Вы не читаете что вам пишут, ищите готовое решение которого нет.

 

Вы даже не представляете, сколько я  перепробовал, вчера до 7-ми утра со дня, и сегодня весь день. Так что я не ищу готового решения, но и само собой - не отказался-бы

 

Я ищу помощи опытных людей.

Ссылка на сообщение
Поделиться на другие сайты

Вам её выше предоставили, вы не внимательный наверное.

 

IN (?@). - не ищет в перечни значений ячейки через запятую

Ссылка на сообщение
Поделиться на другие сайты

IN (?@). - не ищет в перечни значений ячейки через запятую

Потому что ЭТО СТРОКА! Приведите её к массиву и будет вам счастье, я вам выше ссылку дал на мануал.
Ссылка на сообщение
Поделиться на другие сайты

Потому что ЭТО СТРОКА! Приведите её к массиву и будет вам счастье, я вам выше ссылку дал на мануал.

Привести строку mysql в массив и по ней отфильтровать?...

Было уже подобное, искало опять-же один раз, но при mobili?hren[]=20&hren[]=150 - выводит товар, в перечни поля hren которого есть 150, а товар где есть 20 - не выводится.

Ссылка на сообщение
Поделиться на другие сайты

Потому что я вам дал не ГОТОВОЕ решение - а один из вариантов

Чтобы работало как вы хотите, нужно у первого писать AND а у остальных OR

Но я не собираюсь делать это все за вас

А про приведение строки к массиву - БРЕД, потому как все происходит в MySQL? а не в пыхе...



IN (?@). - не ищет в перечни значений ячейки через запятую

FIND_IN_SET как раз отлично ищет. Только надо подумать немного, а не ждать готового.

Ссылка на сообщение
Поделиться на другие сайты

 

Ответь честно ты долбоёб по жизни или с недавних пор?

Мне 29 лет, какой нахер школьник? Что ты несёшь идиотище?

А по поводу операторов пойди и сам почитай что каждый из них делает, я эту матчасть ужа давно изучил.

Ну ты и сказочный долбоёб т.к. к 30 годам не научился нормально общаться. Задрот компьютерный который строит из себя программиста, а по факту чмо, которое запрос не может построить. Выучил симплу, копирует код и вставляет в другие места выдавая себя за ахиренно крутого прогера. Понятие школьник значит что ты олень, а не именно "школьник", но вобще математику тебе стоило бы подучить. Если я тебя попрошу построить запрос на нативном mysql ты нихера его не сможешь построить т.к. привык работать с симпловым placehold и понятия не имеешь чем отличается ID IN и LIKE

 

 

 

Блин, причем тут serialize или json_encode??

Вы вообще понимаете, о чем разговор? Чем вам это поможет, если надо сделать все в одном запросе? В MySQL? а не в ПХП...

Пробуйте сначала читать, а потом уже отвечать.

Притом что для поиска по строке используется LIKE или оператор =, всякие FIND_IN_SET возвращают только позицию вхождения в строку. Я даже примерно не могу понять где это может быть нужно, но если вы сделали, то вам виднее. Вобще считаю полной глупостью делать такие вещи в mysql, т.к. для этого существует strpos в пхп, а заменить стандартный LIKE на FIND_IN_SET вобще жесть, но дело ваше. Каждый программирует так как умеет. Noxter вон вобще програмер от бога :lol:

Изменено пользователем a13x
Ссылка на сообщение
Поделиться на другие сайты

К автору:

 

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']; 

Вот так надо.

Ссылка на сообщение
Поделиться на другие сайты

К автору:

 

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']; 
Вот так надо.
Пшла нахуй шавка недоношенная
Ссылка на сообщение
Поделиться на другие сайты
  • Решение

Притом что для поиска по строке используется LIKE или оператор =, всякие FIND_IN_SET возвращают только позицию вхождения в строку. Я даже примерно не могу понять где это может быть нужно, но если вы сделали, то вам виднее. Вобще считаю полной глупостью делать такие вещи в mysql, т.к. для этого существует strpos в пхп, а заменить стандартный LIKE на FIND_IN_SET вобще жесть, но дело ваше. Каждый программирует так как умеет. Noxter вон вобще програмер от бога :lol:

 

 

Ну я думаю тут вся проблема в том что ТС не выразил толком свою мысль, а начал писать коды в которых мало что понимает. Теперь каждый интерпретирует это по своему.

 

Насколько я понял - то он создал в вариантах текстовое поле в котором перечисляет какие то цифровые идентификаторы (допустим 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 нужно добавить в основной запрос на выборку товаров 

Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты

yr4ik, спасибо вам большое. Именно то, что нужно. Мне до такого еще учиться и учиться, сам-бы не сообразил это точно)) Еще раз - спасибо!  :)

Ссылка на сообщение
Поделиться на другие сайты

Правильно FIND_IN_SET  возвращает позицию вхождения :)

Есть вхождение - возвращает, нет вхождения - не возвращает...

А LIKE по-вашему что делает?

Ссылка на сообщение
Поделиться на другие сайты

А можно-ли как-то произвести удаление конкретного значения из поля $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));

Но там строка, а тут ячейка с перечнем через запятую.

Ссылка на сообщение
Поделиться на другие сайты

можно. Лучше бы конечно организовать это все по нормальному через таблицу. 
Ну я думаю вам это бесплатно никто не опишет как делать, а сами не сможете...
 

 

$this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren));
Ссылка на сообщение
Поделиться на другие сайты

 

можно. Лучше бы конечно организовать это все по нормальному через таблицу. 

Ну я думаю вам это бесплатно никто не опишет как делать, а сами не сможете...

 

 

$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 к данному варианту добавлено - столько в админке самих вариантов (клонов) и выводилось)

Ссылка на сообщение
Поделиться на другие сайты

Нет тут никаких чудес. Выводится в соответствии с правилами SQL, PHP и прочих программистских технологий.

А то, что не показывает так, как Вы хотите - это совсем не чудо.

Если собираетесь работать и дальше методом тыка, то таких "чудес" еще много можете встретить.

Ссылка на сообщение
Поделиться на другие сайты

Нет тут никаких чудес. Выводится в соответствии с правилами SQL, PHP и прочих программистских технологий.

А то, что не показывает так, как Вы хотите - это совсем не чудо.

Если собираетесь работать и дальше методом тыка, то таких "чудес" еще много можете встретить.

 

Хех, ага :) 

Ссылка на сообщение
Поделиться на другие сайты

Нет тут никаких чудес. Выводится в соответствии с правилами SQL, PHP и прочих программистских технологий.

А то, что не показывает так, как Вы хотите - это совсем не чудо.

Если собираетесь работать и дальше методом тыка, то таких "чудес" еще много можете встретить.

+1
Ссылка на сообщение
Поделиться на другие сайты

 

можно. Лучше бы конечно организовать это все по нормальному через таблицу. 

Ну я думаю вам это бесплатно никто не опишет как делать, а сами не сможете...

 

 

$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)"
Ссылка на сообщение
Поделиться на другие сайты

 

Не работает код  :(

 

Выдает ошибку:

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));
Ссылка на сообщение
Поделиться на другие сайты

 

$this->db->query("UPDATE __variants SET hren=TRIM(BOTH ',' FROM REPLACE(CONCAT(',', hren,',') ,',?,', ',')) WHERE FIND_IN_SET(?, hren)", intval($delete_hren), intval($delete_hren));

 

Очень благодарю, все получилось.

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...