如何安全地使用保留的SQL名称?

时间:2015-01-09 05:24:00

标签: sql-server cakephp cakephp-3.0 query-builder cakephp-bake

我使用Cakephp 3使用sqlserver作为数据源服务器。我确信我的数据库连接没有问题..因为home.ctp提示我已连接到我的数据库..而且我也使用迁移插件来创建我的表..看起来像使用这些工具没有问题。但是在我烘焙MVC之后,我的页面只有错误...

例如,

$ bin \ cake烘焙所有测试

我发现没有错误,MVC在其特定文件夹,testController.php,testTable等中。

并在浏览器中 本地主机:8765个\测试

但我得到的只是不同错误的页面..我看到了

Error: SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near the keyword 'desc'.

SELECT * FROM (SELECT Tests.id AS [Tests__id], Tests.desc AS [Tests__desc], (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS [_cake_page_rownum_] FROM tests Tests) _cake_paging_ WHERE _cake_paging_._cake_page_rownum_ <= :c0

左侧有更多错误。

我认为这是因为带有错误查询的控制器或bake生成的查询仅适用于mysql。我只是想知道如何处理这件事。有没有我忘了做的设置?请指教。我是Cakephp的新手,英语不是我的母语,如果我无法正确解释我的问题,对不起。提前谢谢。

3 个答案:

答案 0 :(得分:8)

正如Vishal Gajjar在评论中已经提到的那样,你使用保留关键字desc作为你的列名,因此错误,它不是故障,它是你的。

为了能够使用这些保留字,需要正确引用列名,但CakePHP 3不再默认自动引用,因为这是一项昂贵的操作。

如果您坚持使用保留字,请通过quoteIdentifiers配置中的app.php选项启用标识符引用,或使用autoQuoting()enableAutoQuoting() CakePHP 3.4)DB驱动程序的方法。

另见

答案 1 :(得分:1)

您可以在有问题的查询之前使用此代码:

$this->Tests->connection()->driver()->autoQuoting(true);

当你完成后,你可以关闭自动报价:

$this->Tests->connection()->driver()->autoQuoting(false);

如此糟糕的表现只会出现问题查询。

答案 2 :(得分:-1)

使用此:

SELECT * FROM (SELECT Tests.id AS [Tests__id], Tests.[desc] AS [Tests__desc], 
(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS [_cake_page_rownum_] FROM tests Tests) _cake_paging_
WHERE _cake_paging_._cake_page_rownum_ <= :c0

如果您使用关键字,请在方括号[ ]

中使用它