简体   繁体   中英

Zend Framework Magento Where statement returns error

This is my Query in Magento.

        $where = "LIKE '%".$value."%'";
        foreach($tokens as $token) {
            $where .= " OR at_name.value LIKE '%$token%'";
        }

        $this->getCollection()->getSelect()
             ->joinInner(array('at_name' => 'mgmx_catalog_product_entity_text'), '(at_name.entity_id = at_visibility.entity_id)')
             ->where("at_name.value ?" ,$where);

If I run this Query, it will return an error

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''LIKE \\'%REMAX GREY%\\' OR at_name.value LIKE \\'%REMAX%\\' OR at_name.value LIKE \\' at line 4

This is the query in Mysql.

SELECT COUNT(DISTINCT e.entity_id) 
FROM `mgmx_catalog_product_entity` AS `e`
INNER JOIN `mgmx_catalog_product_entity_int` AS `at_status` 
ON (`at_status`.`entity_id` = `e`.`entity_id`) AND 
(`at_status`.`attribute_id` = '96') AND (`at_status`.`store_id` = 0)
INNER JOIN `mgmx_catalog_product_entity_int` AS `at_visibility` 
ON (`at_visibility`.`entity_id` = `e`.`entity_id`) AND 
(`at_visibility`.`attribute_id` = '102') AND (`at_visibility`.`store_id` = 0)
INNER JOIN `mgmx_catalog_product_entity_text` AS `at_name` ON (at_name.entity_id = at_visibility.entity_id) WHERE (at_name.value 'LIKE 
\'%REMAX GREY%\' OR at_name.value LIKE \'%REMAX%\' OR at_name.value LIKE 
\'%GREY%\'')

The error is here somewhere

 (at_name.value 'LIKE 
\'%REMAX GREY%\' OR at_name.value LIKE \'%REMAX%\' OR at_name.value LIKE 
\'%GREY%\'')

If I remove the '' and the \\ it will run normally. Like so

(at_name.value LIKE 
'%REMAX GREY%' OR at_name.value LIKE '%REMAX%' OR at_name.value LIKE 
'%GREY%')

I can't get rid of it as the zend framework is the one doing the '' and the backslashes. How do i deal with this?

Thanks.

Additional '' and escaping were added by method where(). But the second parameter is optional so simply append collected where statement to condition parameter like this:

$this->getCollection()->getSelect()
             ->joinInner(array('at_name' => 'mgmx_catalog_product_entity_text'), '(at_name.entity_id = at_visibility.entity_id)')
             ->where("at_name.value ".$where);

PS. still messing around with tokenized search in admin grid? :) I coded this quickly out of mind. There are even more elegant ways to implement this. check where() and _where() methods in class Zend_Db_Select

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM