【问题标题】:Zend Framework Magento Where statement returns errorZend Framework Magento Where 语句返回错误
【发布时间】:2017-10-30 12:52:15
【问题描述】:

这是我在 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);

如果我运行这个查询,它将返回一个错误

#1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 4 行的 ''LIKE \'%REMAX GREY%\' OR at_name.value LIKE \'%REMAX%\' OR at_name.value LIKE \' 附近使用正确的语法

这是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%\'')

错误就在这里

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

如果我删除''\,它将正常运行。像这样

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

我无法摆脱它,因为 zend 框架是执行 '' 和反斜杠的框架。我该如何处理?

谢谢。

【问题讨论】:

  • 我不熟悉zend-framework,但这不是绑定的方式。每个值都需要一个占位符。 ? 是 1 个值并被引用。这会导致您的 SQL 语句成为字符串。如果你做了at_name.value = ?,你不会得到错误,但你也不会得到结果。

标签: php mysql magento zend-framework


【解决方案1】:

通过 where() 方法添加了额外的 '' 和转义。但第二个参数是可选的,因此只需将收集的 where 语句附加到条件参数,如下所示:

$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);

附言。仍然在管理网格中搞乱标记化搜索? :) 我很快就编码了这个。还有更优雅的方法来实现这一点。检查 Zend_Db_Select 类中的 where() 和 _where() 方法

【讨论】:

  • 是的,先生。这位先生仍然有问题。
  • ;) 如果我的回答有帮助,别忘了接受并投票
  • 您可以使用 print_r() 来获取对象的内容。但要注意对象可能非常大!
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多