调试Magento扩展中的SQL语法错误

调试Magento扩展中的SQL语法错误,magento,Magento,我是Magento的新手,在调试最近安装的扩展时遇到了这个错误。我试图理解日志,但不知道到底是什么问题。有人能告诉我根据下面的日志从哪里开始调试吗 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right synta

我是Magento的新手,在调试最近安装的扩展时遇到了这个错误。我试图理解日志,但不知道到底是什么问题。有人能告诉我根据下面的日志从哪里开始调试吗

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS `query_id`, `s`.`product_id`, MATCH (s.data_index) AGAINST ('' IN BOOLEAN MOD' at line 1

Trace:
#0 /var/www/html/springmaternity/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#1 /var/www/html/springmaternity/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#2 /var/www/html/springmaternity/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#3 /var/www/html/springmaternity/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)
#4 /var/www/html/springmaternity/lib/Varien/Db/Adapter/Pdo/Mysql.php(428): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)
#5 /var/www/html/springmaternity/app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php(393): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ca...', Array)
#6 /var/www/html/springmaternity/app/code/core/Mage/CatalogSearch/Model/Fulltext.php(136): Mage_CatalogSearch_Model_Resource_Fulltext->prepareResult(Object(Mage_CatalogSearch_Model_Fulltext), '', Object(Yireo_DisableLog_Model_Rewrite_Catalogsearch_Query))
#7 /var/www/html/springmaternity/app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext/Collection.php(55): Mage_CatalogSearch_Model_Fulltext->prepareResult()
#8 /var/www/html/springmaternity/app/code/core/Mage/CatalogSearch/Model/Layer.php(58): Mage_CatalogSearch_Model_Resource_Fulltext_Collection->addSearchFilter('')
#9 /var/www/html/springmaternity/app/code/community/Rayfox/Catalog/Model/Search/Layer.php(18): Mage_CatalogSearch_Model_Layer->prepareProductCollection(Object(Mage_CatalogSearch_Model_Resource_Fulltext_Collection))
#10 /var/www/html/springmaternity/app/code/core/Mage/CatalogSearch/Model/Layer.php(42): Rayfox_Catalog_Model_Search_Layer->prepareProductCollection(Object(Mage_CatalogSearch_Model_Resource_Fulltext_Collection))
#11 /var/www/html/springmaternity/app/code/core/Mage/Catalog/Model/Layer.php(290): Mage_CatalogSearch_Model_Layer->getProductCollection()
#12 /var/www/html/springmaternity/app/code/core/Mage/Catalog/Model/Layer.php(220): Mage_Catalog_Model_Layer->_getSetIds()
#13 /var/www/html/springmaternity/app/code/core/Mage/Catalog/Block/Layer/View.php(163): Mage_Catalog_Model_Layer->getFilterableAttributes()
#14 /var/www/html/springmaternity/app/code/local/FME/Layerednav/Block/Layer/View.php(85): Mage_Catalog_Block_Layer_View->_getFilterableAttributes()
#15 /var/www/html/springmaternity/app/code/core/Mage/Core/Block/Abstract.php(293): FME_Layerednav_Block_Layer_View->_prepareLayout()
#16 /var/www/html/springmaternity/app/code/core/Mage/Core/Model/Layout.php(456): Mage_Core_Block_Abstract->setLayout(Object(Mage_Core_Model_Layout))
#17 /var/www/html/springmaternity/app/code/core/Mage/Core/Model/Layout.php(472): Mage_Core_Model_Layout->createBlock('layerednav/sear...', 'layer')
#18 /var/www/html/springmaternity/app/code/core/Mage/Core/Model/Layout.php(239): Mage_Core_Model_Layout->addBlock('layerednav/sear...', 'layer')
#19 /var/www/html/springmaternity/app/code/core/Mage/Core/Model/Layout.php(205): Mage_Core_Model_Layout->_generateBlock(Object(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element))
#20 /var/www/html/springmaternity/app/code/core/Mage/Core/Controller/Varien/Action.php(344): Mage_Core_Model_Layout->generateBlocks()
#21 /var/www/html/springmaternity/app/code/core/Mage/Core/Controller/Varien/Action.php(269): Mage_Core_Controller_Varien_Action->generateLayoutBlocks()
#22 /var/www/html/springmaternity/app/code/local/FME/Layerednav/controllers/FrontController.php(54): Mage_Core_Controller_Varien_Action->loadLayout()
#23 /var/www/html/springmaternity/app/code/core/Mage/Core/Controller/Varien/Action.php(418): FME_Layerednav_FrontController->searchAction()
#24 /var/www/html/springmaternity/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('search')
#25 /var/www/html/springmaternity/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#26 /var/www/html/springmaternity/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#27 /var/www/html/springmaternity/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#28 /var/www/html/springmaternity/sg/index.php(90): Mage::run('sg', 'website')
#29 {main}

如果您有一个模型,它正在执行查询,并且您想知道将生成什么样的SQL,那么您有一些选择, 我最喜欢的是使用下面的

$collection = Mage::getModel('customcodes/code')->getCollection()
->addFieldToSelect('code')
->addFieldToFilter('order_id',array('eq'=>247938))
->addFieldToFilter('code_type',array('eq'=>'CODESQAC'));
$sql=$collection->getSelect()->

然后,$sql就可以了

SELECT `main_table`.`code` FROM `custom_codes` AS `main_table` WHERE (`order_id` = 247938) AND (`code_type` = 'CODESQAC')
现在,您可以通过magnet语法来了解为什么它不会像您看到的那样拉取结果或抛出错误。 听起来您知道Magento代码的来源,因此使用此方法将帮助您确定它们使用的语法是否不正确

另外,检查代码中是否有硬编码的表名,而不是使用Magento工厂方法和/或调用特定的表名,而不是使用以下类似的方法来获取实际的表名(您可以有一个表名前缀,而原始代码可以是硬编码的)

下面是一个使用硬编码表名而不是使用配置来获取表名的示例(对于表名前缀)

$collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'), 'main_table.entity_id = sfoa.parent_id and sfoa.address_type = \'billing\'', array('sfoa.company'));
正确的方法应该是这样

$resource = Mage::getSingleton('core/resource');
$sales_table = $resource->getTableName('sales/order_address');

$collection->getSelect()->joinLeft(array('sfoa'=>$sales_table), 'main_table.entity_id = sfoa.parent_id and sfoa.address_type = \'billing\'', array('sfoa.company'));
希望这能帮助您检查错误的语法,并最终检查实际SQL的创建方式和内容

看看这个。
$resource = Mage::getSingleton('core/resource');
$sales_table = $resource->getTableName('sales/order_address');

$collection->getSelect()->joinLeft(array('sfoa'=>$sales_table), 'main_table.entity_id = sfoa.parent_id and sfoa.address_type = \'billing\'', array('sfoa.company'));