2016-06-08 88 views
-3

我试图使用Magento的主题,当我导入主题数据,我得到的是说SQL查询语法错误“”附近

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 '' at line 2, query was: 

SELECT `#__cms_page`.* 
FROM `#__cms_page` 
INNER JOIN `#__cms_page_store` AS `cms_page_store` 
    ON #__cms_page.page_id = cms_page_store.page_id 
WHERE (`#__cms_page`.`identifier`='home-demo-01') 
    AND (is_active = 1) 
    AND (cms_page_store.store_id IN (0, 1)) 
ORDER BY `cms_page_store`.`store_id` DESC 
LIMIT 1 

我不能似乎找到了问题,因为它的SQL错误说语法错误几乎没有..

+0

始终指定您正在使用的RDBMS。这是MySQL吗? – sstan

+0

“Magento主题”与我意识到的SQL无关。您是否使用某种生成查询的CMS软件? –

+0

你是对的,我编辑并添加了RDBMS。此外,我只是下载了一个magento的主题,并从主题中的sql文件上传示例数据,这些是表的名称,我不知道该主题是否使用CMS软件。 –

回答

1

你还没有逃过ON子句中的标识符引用。

这里就是你缺少反引号:

ON #__cms_page .page_id = cms_page_store.page_id 
^  ^

如果我们打算逃跑的标识符,我们宁愿做一贯。我的首选是为表格分配一个简短的别名。另外,对is_active的引用应该被限定......哪个表是该列的来源?

我的倾向是写像这样的查询,只有逃避实际需要进行转义标识符:

SELECT p.* 
    FROM `#__cms_page` p 
    JOIN `#__cms_page_store` s 
     ON s.page_id = p.page_id 
    WHERE (p.identifier = 'home-demo-01') 
    AND (p.is_active = 1) 
    AND (s.store_id IN (0, 1)) 
    ORDER BY s.store_id DESC 
    LIMIT 1 

如果我要逃不需要进行转义标识符,我会随机附上全部反引号。

+0

OMG哇谢谢!我不知道SQL中的backsticks和单引号有什么区别,它可以与backsticks一起工作,而不是单引号 –

+0

非常感谢,如果是我的代码(我将从现在开始)是一个主题下载的自动代码.. –

+0

@ShayMualem:很多生成SQL的框架都会自动转义每一个标识符。因为这很容易做到。逃避标识符永远无效。这要比找出标识符是否需要转义以及为每个标识符这样做要简单得多。只是逃避一切而已。 – spencer7593