+ Ответить в теме
Показано с 1 по 8 из 8
  1. #1
    ViArts Man dav300 за этого человека можно гордится dav300 за этого человека можно гордится dav300 за этого человека можно гордится dav300 за этого человека можно гордится dav300 за этого человека можно гордится dav300 за этого человека можно гордится dav300 за этого человека можно гордится dav300 за этого человека можно гордится
    Регистрация
    18.02.2011
    Адрес
    Москва
    Возраст
    33
    Сообщений
    223
    Сказали 'Спасибо' за это сообщение. :
    6 за это сообщение
    104 Всего
    Загрузки
    8
    Закачек
    0
    Вес репутации
    18

    По умолчанию фильтр товаров + расширенный поиск = совместная работа

    Здравствуйте,
    Столкнулся со следующей проблемой. Если в расширенный поиск вынести какую либо опцию то по результатам поиска можно получить следующее не радующее сообщение :

    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) ";
                    }
                }
            } 
    По итогам выше описанных манипуляций все прекрасно заработает.

    Я что-то только пока так и не пойму толи это действительно баг в системе толи я где-то в настройках что-то не так сделал !??!

    Есть варианты ?
    Последний раз редактировалось dav300; 20.04.2011 в 21:44.
    Digg this Post!Bookmark Post in Technorati
    Ответить с цитированием Ответить с цитированием
    Спасибо

  2. Сказали спасибо:

    oldmanager (02.03.2012) , nemo (22.04.2011) , samrat (22.04.2011) , DimTai (21.04.2011) , Dio (20.04.2011) , newshop (20.04.2011)

  3. #2
    Сообщество ViArts oldmanager как роза среди колючек oldmanager как роза среди колючек oldmanager как роза среди колючек
    Регистрация
    12.02.2010
    Адрес
    Москва
    Сообщений
    229
    Сказали 'Спасибо' за это сообщение. :
    0 за это сообщение
    25 Всего
    Загрузки
    17
    Закачек
    0
    Вес репутации
    14

    По умолчанию Re: фильтр товаров + расширенный поиск = совместная работа

    Вложение 592
    Цитата Сообщение от dav300 Посмотреть сообщение
    Здравствуйте,
    Столкнулся со следующей проблемой. Если в расширенный поиск вынести какую либо опцию то по результатам поиска можно получить следующее не радующее сообщение :
    DB ERROR 1064
    ....
    На лицо синтаксическая ошибка.

    Решение :
    В файле blocks/block_filter.php необходимо произвести следующие изменения :
    ...
    По итогам выше описанных манипуляций все прекрасно заработает.
    Спасибо, dav300. Я тоже столкнулся с этой ошибкой и Ваш совет помог, но лишь частично.
    В админке, на странице настроек расширенного поиска, я проставил галки в разделах "Поля поиска", "Поиск в опциях товаров", "Поиск в спецификациях товаров" и заполнил "Предустановленные значения (по одному на отдельной строке)".

    В результате расширенный поиск заработал, но только по Производителю и по предустановленным значениям из спецификации. А поиск по опциям, т.е. по размеру и по цене (т.к. опцией является размер с ценой у некоторых товаров) продолжает выдавать ошибку:
    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://example.com/products_search.php?pq=1&fq=7&pn_1=...здесь пять строк фигни...=&manf=&lprice=&hprice=
    Referrer URL: http://example.com/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_properties ip_1 ON i.item_id = ip_1.item_id) LEFT JOIN va_items_properties_values ipv_1 ON ipv_1.property_id= ip_1.property_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 AND i.guest_access_level&2 AND AND ip_1.property_name='Размер' AND (ip_1.property_description LIKE '%160%' OR ipv_1.property_value LIKE '%160%') 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 ip_1.property_name='Размер' AND (ip_1.property_description LIKE '%16' at line 1 
    Может быть есть какое-то решение данной проблемы?

    P.S. И ещё.
    На странице с результатом поиска сверху появляется надпись:
    Найдено 6 товаров, соответствующих запросу ' '
    Мне кажется, что в пустых кавычках должен быть прописан запрос. Как его туда добавить?
    Последний раз редактировалось oldmanager; 02.03.2012 в 17:35.
    Digg this Post!Bookmark Post in Technorati
    Ответить с цитированием Ответить с цитированием
    Спасибо

  4. #3
    Moderator Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима Aleksey репутация неоспорима
    Регистрация
    23.11.2010
    Сообщений
    484
    Сказали 'Спасибо' за это сообщение. :
    2 за это сообщение
    357 Всего
    Загрузки
    15
    Закачек
    0
    Вес репутации
    48

    По умолчанию Re: фильтр товаров + расширенный поиск = совместная работа

    Задвоенный AND в запросе:

    Надо искать, откуда он берется.

    Или попробовать с помощью str_replace непосредственно перед выполнением запроса в самом тексте запроса заменить строку:
    Код:
    AND AND
    на:
    Код:
    AND true AND
    Digg this Post!Bookmark Post in Technorati
    Ответить с цитированием Ответить с цитированием
    Спасибо

  5. Сказали спасибо:

    oldmanager (03.03.2012) , Dio (03.03.2012)

  6. #4
    Сообщество ViArts oldmanager как роза среди колючек oldmanager как роза среди колючек oldmanager как роза среди колючек
    Регистрация
    12.02.2010
    Адрес
    Москва
    Сообщений
    229
    Сказали 'Спасибо' за это сообщение. :
    0 за это сообщение
    25 Всего
    Загрузки
    17
    Закачек
    0
    Вес репутации
    14

    По умолчанию Re: фильтр товаров + расширенный поиск = совместная работа

    По аналогии с первым постом я нашёл в файле blocks/block_filter.php кусок кода, где присутствует ip_1.property_name= (параметр после двойного AND; в первом посте был параметр f_1.feature_name=)
    PHP код:
            $pr_where = ""; $pr_brackets = ""; $pr_join = "";
            if (
    $pq > 0) {
                for (
    $pi = 1; $pi <= $pq; $pi++) {
                    
    $property_name = get_param("pn_" . $pi);
                    
    $property_value = get_param("pv_" . $pi);
                    if (
    strlen($property_name) && strlen($property_value)) {
                        
    $pr_where .= " AND ip_".$pi.".property_name=" . $db->tosql($property_name, TEXT);
                        
    $pr_where .= " AND (ip_".$pi.".property_description  LIKE '%" . $db->tosql($property_value, TEXT, false) . "%' ";
                        
    $pr_where .= " OR ipv_".$pi.".property_value LIKE  '%" . $db->tosql($property_value, TEXT, false) . "%') ";
                        
    $pr_brackets .= "((";
                        
    $pr_join  .= " LEFT JOIN " . $table_prefix .  "items_properties ip_".$pi." ON i.item_id = ip_".$pi.".item_id) ";
                        
    $pr_join  .= " LEFT JOIN " . $table_prefix .  "items_properties_values ipv_".$pi." ON ipv_".$pi.".property_id=  ip_".$pi.".property_id) ";
                    }
                }
            } 
    и добавил туда $flag = 0; и if ($flag>=1) {$pr_where .= " AND ";}
    т.е. получилось
    PHP код:
            $pr_where = ""; $pr_brackets = ""; $pr_join = "";
    $flag = 0;
            if (
    $pq > 0) {
                for (
    $pi = 1; $pi <= $pq; $pi++) {
                    
    $property_name = get_param("pn_" . $pi);
                    
    $property_value = get_param("pv_" . $pi);
                    if (
    strlen($property_name) && strlen($property_value)) {
    if (
    $flag>=1) {$pr_where .= " AND ";}
                        
    $pr_where .= " AND ip_".$pi.".property_name=" . $db->tosql($property_name, TEXT);
                        
    $pr_where .= " AND (ip_".$pi.".property_description LIKE '%" . $db->tosql($property_value, TEXT, false) . "%' ";
                        
    $pr_where .= " OR ipv_".$pi.".property_value LIKE '%" . $db->tosql($property_value, TEXT, false) . "%') ";
                        
    $pr_brackets .= "((";
                        
    $pr_join  .= " LEFT JOIN " . $table_prefix . "items_properties ip_".$pi." ON i.item_id = ip_".$pi.".item_id) ";
                        
    $pr_join  .= " LEFT JOIN " . $table_prefix . "items_properties_values ipv_".$pi." ON ipv_".$pi.".property_id= ip_".$pi.".property_id) ";
                    }
                }
            } 
    Но изменений не произошло, в ошибке по прежнему двойная AND.