即使产品存在,尝试按名称加载产品(“什么是测试?”)也会失败。
$product = Mage::getModel('catalog/product')->loadByAttribute('name', 'What are Tests?');
它适用于任何其他名称。
由于Magento最终通过PDO,会不会“?”在名称被解释为一个参数,因为我没有传递任何值,结束查询实际上将寻找“什么是测试”...因此找不到产品?
如果是这样,我怎么逃避呢?
干杯!
答案 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子句创建一个集合,该子句使用单个字符通配符“_”代替“?”,然后从顶部取出第一个项目。不理想,但它应该是一个充分的工作。