Вывод товаров из диапазона или как бороться с float

#
Вывод товаров из диапазона или как бороться с float
Здравствуйте.
В процессе работы с этой замечательной CMS появилась очень и очень интересная проблема.
Была задача написать калькулятор, который выводит товары по значению доп. свойства в диапазоне -5% +15% от полученного калькулятором числа. Вот часть кода, которым я, собственно, и выводил этот диапазон

...
$element['type'] = 1;
$element['property_id'] = 134;
$element['prefix'] = 'and';
$element['if'] = '>';
$element['value'] = $result-$result*0.05;
$element['sufix'] = '';
$param['select'][] = $element;

$element['type'] = 1;
$element['property_id'] = 134;
$element['prefix'] = 'and';
$element['if'] = '<';
$element['value'] = $result+$result*0.15;
$element['sufix'] = '';
$param['select'][] = $element;
...


К примеру, у нас выходит диапазон 1.65 и 2.006, и у нас есть товар со значением доп. свойства 10.00. И он попадает в этот диапазон. Насколько я понял, сравнение остановилось на первой цифре, вот и вышло, что 2 больше 10. Подскажите дураку, как мне исправить это?
Разделителем является точка.
#
Re: Вывод товаров из диапазона или как бороться с float
Grane писал(а):
Подскажите дураку, как мне исправить это?
- причина проблемы в том, что в базе данных значения свойств(даже числовые) хранятся как строки. Поэтому и сравниваются они по правилам сравнения строк. Вам необходимо добавить в этот код приведение полей таблицы базы данных к числовому типу. Пример кода см. http://www.hostcms.ru/forums/17/1636/ в последнем сообщении темы.
#
Re: Вывод товаров из диапазона или как бороться с float
Наталья, спасибо за сылку, ознакомился, но переделать код выше под приведенное решение у меня не получилось. Ошибка в синтаксисе.


...
$element['type'] = 1;
$element['name'] = 'shop_items_catalog_table.shop_shops_id'; // <- объясните, что это
$element['prefix'] = ' or ';
$element['if'] = '=';
$element['value'] = $result;
$element['sufix'] = "
AND (shop_list_of_properties_table.shop_list_of_properties_id=134
AND CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED) > {$min}    
AND  shop_list_of_properties_table.shop_list_of_properties_id=134
AND CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED) < {$max}
) GROUP BY shop_items_catalog_table.shop_items_catalog_item_id
HAVING COUNT(shop_properties_items_table.shop_properties_items_id)= 1)";
$param['select'][] = $element;
...


Ошибка выполнения запроса! - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND shop_properties_items_table.shop_properties_items_value = '1.995' AND (sh' at line 9
Предупреждение: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource в файле /var/www/asta/data/www/gknk.ru/modules/shop/shop.class.php (строка 23460)
Ошибка выполнения запроса! - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND shop_properties_items_table.shop_properties_items_value = '1.995' AND (sh' at line 1


Скобочки перед group на результат не влияли.
Вообще в этом условии 1 лишнее, мне нужно решение из интервала. пробовал различные варианты с этими скобочками и условиями, или   $element['value']  приравнивать не к числу, а = 'CONVERT(... '
Очевидно, что не так пробовал. Будте добры, помогите привести код из первого поста к правильному формату. Благодарю.
#
Re: Вывод товаров из диапазона или как бороться с float
Grane писал(а):
объясните, что это
- это поле(в таблице товаров), содержащее идентификатор магазина.
$element = array();
$element['type'] = 1; // 0 - основное св-во, 1 - дополнительное
$element['prefix'] = 'and'; // префикс
$element['property_id'] = 134; // ID дополнительного св-ва, указывается если тип = 1
$element['if'] = 'IS NOT NULL'; // Условие
$element['value'] = '';
$element['sufix'] = '';
$param['select'][]=$element;

$from = $result-$result*0.05;
$to = $result+$result*0.15;

$element = array();
$element['type'] = 0;
$element['prefix'] = ' and ';
$element['name'] = 'shop_items_catalog_table.shop_shops_id';
$element['if'] = '=';
$element['value'] = 1;
$element['sufix'] = "AND (shop_list_of_properties_table.shop_list_of_properties_id=134
AND CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED) > {$from}    
AND CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)< {$to}
)";
$param['select'][] = $element;

Во втором блоке в качестве значения параметра $element['value'] вместо 1 подставьте идентификатор вашего магазина.
#
Re: Вывод товаров из диапазона или как бороться с float
Не знаю, как и благодарить, Наталья.
Вариант рабочий, НО(!) он не верно берет интервалы, эксперименты показали, что если $to= 2.006, то товары выводятся вплоть до значения свойства 2.5, что очень категорично.
#
Re: Вывод товаров из диапазона или как бороться с float
Grane, попробуйте вместо:
AND CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED) > {$from}    
AND CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)< {$to}

использовать:
AND (shop_properties_items_table.shop_properties_items_value + 0.0) > {$from}    
AND (shop_properties_items_table.shop_properties_items_value + 0.0) < {$to}
#
Re: Вывод товаров из диапазона или как бороться с float
Наталья, исправление помогло.
Надеюсь, эта тема еще кому-нибудь пригодится
#
Re: Вывод товаров из диапазона или как бороться с float
Скажите, пожалуйста, почему у меня после этого условия в XML нет товаров и групп.

$param['current_group_id'] = 614; // код группы с большой вложенностью
$element = array();
$element['type'] = 1;
$element['prefix'] = 'and';
$element['property_id'] = 1; //id свойства групп
$element['if'] = '<';
$element['value'] = "{$_POST['area']}";
$element['sufix'] = '';
$param['select_groups'][] = $element;

$element = array();
$element['type'] = 1;
$element['prefix'] = ' and ';
$element['property_id'] = 2;
$element['if'] = '>';
$element['value'] = "{$_POST['area']}";
$element['sufix'] = "";
$param['select_groups'][] = $element;


Правильно ли я понимаю, этот запрос идет в таблицу shop_properties_group_value_table? Поле shop_properties_group_value_value преобразовал в INT для удобства.
email project@bugoff.net skype bugoff.net сайт bugoff.net
Модератор
#
Re: Вывод товаров из диапазона или как бороться с float
bugoff,
у Вас товары выбираются из группы 614 (не ее подгрупп) и группы ограничены двумя параметрами по доп. св-вам. Кстати, в приведенном коде Вы допустили 2 SQL-инъекции, прочтите, пожалуйста, руководство по разработке модулей, в конце документа есть советы.
Так делать нельзя:
$element['value'] = "{$_POST['area']}";
$element['value'] = "{$_POST['area']}";
#
Re: Вывод товаров из диапазона или как бороться с float
Спасибо за замечание, сделал обработку quote_smart()
Но как мне тогда заставить выбираться только из 614 группы и всей её вложенности? Сейчас весь этот фильтр сделан через XSL, но интересен php вариант.
P.S данный код не работает, даже если убрать $param['current_group_id'], хотя группы, удовлетворяющие фильтру точно есть
email project@bugoff.net skype bugoff.net сайт bugoff.net
Авторизация