即使产品存在,尝试按名称("什么是测试?")加载产品也会失败.
$product = Mage::getModel('catalog/product')->loadByAttribute('name', 'What are Tests?');
Run Code Online (Sandbox Code Playgroud)
它适用于任何其他名称.
由于Magento最终通过PDO,会不会"?" 在名称被解释为一个参数,因为我没有传递任何值,结束查询实际上将寻找"什么是测试"...因此找不到产品?
如果是这样,我怎么逃避呢?
干杯!
我不确定是否有可能逃脱.当您使用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);
Run Code Online (Sandbox Code Playgroud)
然后,当Zend选择转换为字符串时,它就会出现
IF(_table_name.value_id>0, _table_name.value, _table_name_default.value) = 'Product 7800'''
Run Code Online (Sandbox Code Playgroud)
问题是一个完整的,而不是参数化的地方.它是安全的,因为_getAttributeConditionSql使用Zend的quoteInto方法,但我很确定这意味着如果你的where子句有一个原始的"?"你就会被卡住.在那里标记(很高兴在此证明是错误的)可能通过直接摆弄资源模型的选择来做到这一点,但我不喜欢用Magento这样做.
无论如何,以下内容应该允许您解决这个问题
$product = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('name',array('like'=>'What are Tests_'))
->getFirstItem();
Run Code Online (Sandbox Code Playgroud)
上面的代码创建了一个带有where子句的集合,该子句使用单个字符通配符"_"代替"?",然后从顶部取出第一个项目.不理想,但它应该是一个充分的工作.