warning SQL ( debug activé ) dans Search.php



  • bonjour

    J'ai le warning suivant quand je lance une recherche produit depuis la boutique.

    Warning: PDO::query(): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'product_attribute_shop.id_product_attribute' in 'field list' in /var/www/html/technokaz/classes/db/DbPDO.php on line 151
    [ SQL ERROR ]
    Unknown column 'product_attribute_shop.id_product_attribute' in 'field list'
    
                    SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
                        pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`,
                        pl.`name`, MAX(i.`id_image`) id_image, il.`legend`, m.`name` manufacturer_name ,(
                        SELECT SUM(weight)
                        FROM ?search_word sw
                        LEFT JOIN ?search_index si
                            ON(sw.id_word = si.id_word)
                        WHERE sw.id_lang = 1
                        AND sw.id_shop = 1
                        AND si.id_product = p.id_product
                        AND (sw.word LIKE '10%')
                    ) position,
                        MAX(product_attribute_shop.`id_product_attribute`) id_product_attribute,
                        DATEDIFF(
                            p.`date_add`,
                            DATE_SUB(
                                "2023-10-22 00:00:00",
                                INTERVAL 20 DAY
                            )
                        ) > 0 new
                    FROM ?product p
                     INNER JOIN ?product_shop product_shop
                ON(product_shop.id_product = p.id_product AND product_shop.id_shop = 1)
                    INNER JOIN `?product_lang` pl
                        ON(p.`id_product` = pl.`id_product`
                        AND pl.`id_lang` = 1 AND pl.id_shop = 1 )
                    
                    LEFT JOIN ?stock_available stock
                    ON(stock.id_product = p.id_product
                    AND stock.id_product_attribute = 0 
                    AND stock.id_shop = 1  
                    AND stock.id_shop_group = 0 )
                    LEFT JOIN `?manufacturer` m
                        ON(m.`id_manufacturer` = p.`id_manufacturer`)
                    LEFT JOIN `?image_shop` i
                        ON(i.`id_product` = p.`id_product`
                        AND i.cover = 1
                        AND i.id_shop = 1
                        AND i.id_lang IN(0, 1))
                    LEFT JOIN `?image_lang` il
                        ON(i.`id_image` = il.`id_image`
                        AND il.`id_lang` = 1)
                    WHERE p.`id_product` IN(45,46,50,51,132,133,198,199)
                    GROUP BY product_shop.id_product
                    ORDER BY  position desc
                    LIMIT 0,20
    
        DbCore->displayError in /classes/db/Db.php:450
        DbCore->query in /classes/db/Db.php:694
        DbCore->executeS in /classes/Search.php:564
        SearchCore::find in /controllers/front/SearchController.php:138
        SearchControllerCore->initContent in /classes/controller/Controller.php:213
        ControllerCore->run in /classes/Dispatcher.php:405
        DispatcherCore->dispatch in /index.php:28 
    

    La conf de mon module recherche est exclusivement sur les mots-clé ( aucun autre critère ). En remontant le fil , c'est la ligne 529

      MAX(product_attribute_shop.`id_product_attribute`) id_product_attribute,
    

    de Search.php qui lève ce warning. Je l'ai supprimé , cela corrige le warning mais dans mon cas , la table de la ligne en question est vide , c'est sans effet sur le résultat de la requête et donc je n'ai pas vraiment cherché à débugger la requête.

    cldt



  • Ce n'est pas normal car cette table a bien la colonne id_product_attribute:
    f8558a0d-d4a6-426f-bfaf-356142fb56bb-image.png

    Et sa structure lors de l'instal:
    195fb8e7-9028-4eb1-b060-0839b426ae7c-image.png



  • c'est la ligne 539 ( pas 529 ) . En regardant de plus près la requête , je vois que la table product_attribute_shop n'est pas préfixée. Je vais faire quelques tests ce soir concernant ce warning en lançant cette requête directement dans dbeaver mais j'ai comme l'impression qu'il manque la jointure avec la table product .



  • Les déclinaisons sont désactivées dans votre boutique ?



  • Il manquait la condition dans ce cas. Le code corrigé:

                $result = $db->executeS('
                    SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
                        pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`,
                        pl.`name`, MAX(i.`id_image`) id_image, il.`legend`, m.`name` manufacturer_name '.$score.'
                        '.(Combination::isFeatureActive() ? ',
                        MAX(product_attribute_shop.`id_product_attribute`) id_product_attribute' : '').',
                        DATEDIFF(
                            p.`date_add`,
                            DATE_SUB(
                                "'.date('Y-m-d').' 00:00:00",
                                INTERVAL '._PS_NB_DAYS_NEW_PRODUCT_.' DAY
                            )
                        ) > 0 new'.(Combination::isFeatureActive() ? '
                            , product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity,
                            IFNULL(product_attribute_shop.`id_product_attribute`,0) id_product_attribute' : '').'
                    FROM '._DB_PREFIX_.'product p
                    '.Shop::addSqlAssociation('product', 'p').'
                    INNER JOIN `'._DB_PREFIX_.'product_lang` pl
                        ON(p.`id_product` = pl.`id_product`
                        AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
                    '.(Combination::isFeatureActive() ? '
                        LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
                            ON(p.`id_product` = product_attribute_shop.`id_product`
                            AND product_attribute_shop.`default_on` = 1
                            AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
                    '.Product::sqlStock('p', 0).'
                    LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
                        ON(m.`id_manufacturer` = p.`id_manufacturer`)
                    LEFT JOIN `'._DB_PREFIX_.'image_shop` i
                        ON(i.`id_product` = p.`id_product`
                        AND i.cover = 1
                        AND i.id_shop = '.(int)$context->shop->id.'
                        AND i.id_lang IN(0, '.(int)Context::getContext()->language->id.'))
                    LEFT JOIN `'._DB_PREFIX_.'image_lang` il
                        ON(i.`id_image` = il.`id_image`
                        AND il.`id_lang` = '.(int)$id_lang.')
                    WHERE p.`id_product` IN('.implode(',', $product_pool).')
                    GROUP BY product_shop.id_product
                    '.($order_by ? 'ORDER BY  '.$alias.$order_by : '').($order_way ? ' '.$order_way : '').'
                    LIMIT '.(int)(($page_number - 1) * $page_size).','.(int)$page_size
                , true, false);
            }
    


  • Effectivement , je n'utilise pas les déclinaisons. Merci pour la correction .


Se connecter pour répondre