Здравствуйте,
Столкнулся со следующей проблемой. Если в расширенный поиск вынести какую либо опцию то по результатам поиска можно получить следующее не радующее сообщение :
PHP код:
DB ERROR 1064
We are very sorry, but an error has occurred while processing your request. Please try the operation again by either pressing the Refresh button on your browser, or by going back one page using the Back button. If the error persists, please contact our web development team.
The details of the error are shown below. Please quote this in any correspondance regarding this problem.
Page URL: http://site_name/eim/products_search.php?pq=0&fq=2&search_string=&s_tit=1&s_cod=1&s_sds=1&s_fds=1&fn_1=%D0%93%D0%BE%D1%80%D0%BE%D0%B4&fv_1=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&fn_2=%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8&fv_2=&category_id=&manf=&lprice=&hprice=
Referrer URL: http://site_name/search.php
Database error: Invalid SQL: SELECT COUNT(DISTINCT i.item_id) AS total , i.manufacturer_id FROM (((((va_items i INNER JOIN va_items_categories ic ON i.item_id=ic.item_id) ) LEFT JOIN va_items_sites AS s ON s.item_id=i.item_id) LEFT JOIN va_items_subscriptions AS sb ON sb.item_id=i.item_id) LEFT JOIN va_features f_1 ON i.item_id = f_1.item_id) WHERE i.is_showing=1 AND i.is_approved=1 AND ((i.hide_out_of_stock=1 AND i.stock_level > 0) OR i.hide_out_of_stock=0 OR i.hide_out_of_stock IS NULL) AND (i.language_code IS NULL OR i.language_code='' OR i.language_code='ru') AND (i.sites_all=1 OR s.site_id=1) AND i.guest_access_level&2 AND AND f_1.feature_name='Город' AND f_1.feature_value LIKE '%Москва%' GROUP BY i.manufacturer_id
MySQL Error: 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 f_1.feature_name='Город' AND f_1.feature_value LIKE '%Москва%' G' at line 1
Как видно из описания ошибки проблема в том что откуда-то и по непонятной причине добавляется второй оператор AND
PHP код:
i.guest_access_level&2 AND AND f_1.feature_name
На лицо синтаксическая ошибка.
Решение :
В файле blocks/block_filter.php необходимо произвести следующие изменения :
блок :
PHP код:
if ($fq > 0) {
for ($fi = 1; $fi <= $fq; $fi++) {
$feature_name = get_param("fn_" . $fi);
$feature_value = get_param("fv_" . $fi);
if (strlen($feature_name) && strlen($feature_value)) {
$pr_where .= " AND f_".$fi.".feature_name=" . $db->tosql($feature_name, TEXT);
$pr_where .= " AND f_".$fi.".feature_value LIKE '%" . $db->tosql($feature_value, TEXT, false) . "%' ";
$pr_brackets .= "(";
$pr_join .= " LEFT JOIN " . $table_prefix . "features f_".$fi." ON i.item_id = f_".$fi.".item_id) ";
}
}
}
надо заменить на следующий код
PHP код:
$flag = 0;
if ($fq > 0) {
for ($fi = 1; $fi <= $fq; $fi++) {
$feature_name = get_param("fn_" . $fi);
$feature_value = get_param("fv_" . $fi);
if (strlen($feature_name) && strlen($feature_value)) {
if ($flag>=1) {$pr_where .= " AND ";}
$pr_where .= " f_".$fi.".feature_name=" . $db->tosql($feature_name, TEXT);
$pr_where .= " AND f_".$fi.".feature_value LIKE '%" . $db->tosql($feature_value, TEXT, false) . "%' ";
$flag++;
$pr_brackets .= "(";
$pr_join .= " LEFT JOIN " . $table_prefix . "features f_".$fi." ON i.item_id = f_".$fi.".item_id) ";
}
}
}
По итогам выше описанных манипуляций все прекрасно заработает.
Я что-то только пока так и не пойму толи это действительно баг в системе толи я где-то в настройках что-то не так сделал !??!
Есть варианты ?
Социальные закладки