Ох,
denisov999, вот у вас прекрасная идея, и при этом ужасающий образец говнокода! Ну как так можно, а?
Во1х, вы не фильтруете запрос пользователя. Поскольку, во2х, вы при этом еще и не используете стандартный класс DataBase от hostcms, а вместо этого делаете какой-то свой запрос к БД, то засунуть SQL-инъекцию через ваш поиск - нефиг делать!
В3х, вы в первом запросе получаете все id товаров со _всех_ магазинов в системе! А если их несколько, да в каждом по многу товаров? Не жалеете вы ни сервер, ни движок MySQL, ни пользователя, который будет ждать пока все это выполнится.
В4х, ваш метод через исключение лишних товаров, тоже, конечно, работает, но слишком уж затратен как по памяти так и по времени. Не зря он вас пугал в соседней теме!
В5х, вы грубо нарушаете всю парадигму MVC, выводя заголовки страницы прямо из ТДС с помощью оператора echo. Такие вещи надо передавать в xml-документ через external propertys и выводить через xsl-шаблон.
Ну и еще есть к чему придраться по мелочи...
Но я лучше не буду больше придираться, а опубликую здесь добработанный код.
<?php
/**
* @author James V. Kotov
*/
// идентификатор магазина
$shop_id = 1; // подставьте свой!
// название xsl-шаблона
$xsl_name = 'МагазинКаталогТоваровПоиск'; // подставьте свое
// а дальше ничего не трогайте :)
// начальное значение числа элементов на странице.
// должно быть равно нулю (на случай когда нет запроса / ничего не найдено)
$items_on_page = 0;
$param = array();
$external_propertys = array();
// проверяем, передан ли запрос
if (isset($_GET['src']) && to_str($_GET['src']) != '') {
// очищаем запрос от возможных инъекций функцией to_str())
$text = to_str($_GET['src']);
$external_propertys['search_query'] = $text; // передадим в xml поисковый запрос
// создадим экземпляр объекта DateClass
$DateClass = &singleton('DateClass');
// вычисли текущую дату в формате MySQL
$sql_time = $DateClass->DateUnixToSQL(time());
// формируем запрос к БД
/* в запросе учитываем:
- id магазина
- активность товара
- дату публикации товара
- дату окончания публикации товара
- поисковый запрос
Все как в настоящем "фирменном" запросе :-)
*/
$query = " SELECT shop_items_catalog_item_id
FROM shop_items_catalog_table
WHERE
shop_items_catalog_table.shop_shops_id = {$shop_id}
AND
shop_items_catalog_table.shop_items_catalog_is_active = '1'
AND
shop_items_catalog_table.shop_items_catalog_access IN (0,-1)
AND
(shop_items_catalog_table.shop_items_catalog_putend_date >= '{$sql_time}' OR shop_items_catalog_table.shop_items_catalog_putend_date = '0000-00-00 00:00:00')
AND
shop_items_catalog_table.shop_items_catalog_putoff_date <= '{$sql_time}'
AND
shop_items_catalog_table.shop_items_catalog_name LIKE '%{$text}%'";
// создаем экземпляр класса DataBase
$DataBase = &singleton('DataBase');
// выполняем запрос
$result = $DataBase->select($query);
// получаем общее число строк, возвращенных запросом
$count = $DataBase->get_count_row();
// создаем массив для хранения id найденных товаров
$items = array();
// если запрос прошел успешно и вернул хотя бы один товар
if ($result && $count) {
$items_on_page = $count; // выведем на странице все найденные элементы
while ($row = mysql_fetch_assoc($result))
$items[] = $row['shop_items_catalog_item_id']; // заполняем наш массив идентификаторами найденных товаров
} else
$external_propertys['search_header'] = 'Ничего не найдено.'; // иначе передадим в xml сообщение что ничего не нашлось
// если массив $items не пустой
if (sizeof($items)) {
// "раскрываем" массив в строку, через запятую
$items_string = implode(',', $items);
// создаем фильтр
$element = array();
$element['type'] = 0; // фильтр по основному свойству товара
$element['prefix'] = ' and ('; // префикс
$element['name'] = 'shop_items_catalog_table.shop_items_catalog_item_id'; // полное название поля, включая название таблицы
$element['if'] = '>'; // фиктивное условие.
$element['value'] = '0'; //фиктивное условие.
// а вот тут собственно само условие, задающее вывод только нужных нам товаров!
// SQL-оператор IN с перечнем нужных идентификаторов в скобках!
$element['sufix'] = " AND shop_items_catalog_table.shop_items_catalog_item_id IN ({$items_string}) )";
$param['select'][] = $element; // ну и передаем фильтр в параметры метода ShowShop()
}
} else
$external_propertys['search_header'] = 'Поисковый запрос пуст!'; // передадим в xml сообщение что запрос пустой
// создадим экземпляр объекта shop
$shop = &singleton('shop');
$param['current_group_id'] = false; // вывод из всех групп магазина
$param['items_on_page'] = $items_on_page; // передаем число товаров на странице
$shop->ShowShop($shop_id, $xsl_name, $param, $external_propertys);
?>
Вот как-то так. Не тестировал, но должно работать. Если что не так - спрашивайте
UPD: Дополнил запрос учетом активности товаров и дат начала/окончания публикации. Чтобы было как в "родных" запросах HostCMS