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

我使用CakePHP 3使用sqlserver作为数据源服务器。 我相信有没有问题,我的数据库连接..作为home.ctp提示我连接到我的数据库..我也使用迁移插件来创build我的表..似乎有没有问题的工作这些工具。 但是在我烘烤了我的MVC之后,我只有页面充满了错误。

例如$ bin \ cake烘烤所有的testing

我发现没有错误,MVC是在它的特定文件夹,testController.php,testTable等

并在浏览器localhost:8765 \ tests

但我得到的是不同的错误页面。我看到

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

在左边更多的错误。

我认为这是因为控制器错误的查询或查询生成的查询是仅用于mysql。 我只是想知道如何处理这个。 有没有我忘记的设置? 请指教。 我是Cakephp的新手,英文不是我的母语,如果我不能正确解释我的问题,我很抱歉。 提前致谢。

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

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

如果您坚持使用保留字,请使用app.phpconfiguration中的quoteIdentifiers选项启用标识符引用,或者使用数据库驱动程序的autoQuoting()enableAutoQuoting()自CakePHP 3.4起)方法手动启用它。

也可以看看

  • 食谱>数据库访问和ORM>数据库基础>标识符引用
  • Cookbook> 3.x迁移指南>新buildORM升级指南>默认情况下标识符引用已禁用
  • API> \ Cake \ Database \ Driver :: autoQuoting()
  • API> \ Cake \ Database \ Driver :: enableAutoQuoting()

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

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

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

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

如此糟糕的performance只会是有问题的查询。

用这个 :

 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 

如果您使用关键字,请将其用于方括号[ ]