Magento loadByAttribute在问号上失败

时间:2010-08-24 11:28:53

标签: magento pdo

即使产品存在,尝试按名称加载产品(“什么是测试?”)也会失败。

$product = Mage::getModel('catalog/product')->loadByAttribute('name', 'What are Tests?');

它适用于任何其他名称。

由于Magento最终通过PDO,会不会“?”在名称被解释为一个参数,因为我没有传递任何值,结束查询实际上将寻找“什么是测试”...因此找不到产品?

如果是这样,我怎么逃避呢?

干杯!

1 个答案:

答案 0 :(得分:6)

我不确定是否有可能逃脱。当您使用Magento添加属性过滤器时(这是您正在执行的操作),它使用Zend的quoteInto方法创建where组件,然后将结果字符串添加到Zend Select对象。

//create a full where clause
//In this case, $conditionSql = IF(_table_name.value_id>0, _table_name.value, _table_name_default.value) = 'What are Tests?'
$conditionSql = $this->_getAttributeConditionSql($attribute, $condition, $joinType);
...
//add that where clause to a Zend select object 
$this->getSelect()->where($conditionSql);

然后,当Zend选择转换为字符串时,它将显示为

IF(_table_name.value_id>0, _table_name.value, _table_name_default.value) = 'Product 7800'''

问题是一个完整的,而不是参数化的地方。它是安全的,因为_getAttributeConditionSql使用Zend的quoteInto方法,但我很确定这意味着如果你的where子句有一个原始的“?”你就会被卡住。在那里标记(很高兴在此证明是错误的)可能通过直接摆弄资源模型的选择来做到这一点,但我不喜欢用Magento这样做。

无论如何,以下内容应该允许您解决此问题

$product = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('name',array('like'=>'What are Tests_'))
->getFirstItem();

上面的代码使用where子句创建一个集合,该子句使用单个字符通配符“_”代替“?”,然后从顶部取出第一个项目。不理想,但它应该是一个充分的工作。