如何安全地使用保留的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.php
configuration中的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
如果您使用关键字,请将其用于方括号[ ]