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

How to safely use reserved SQL names?

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

例如 $bin\cake 烘焙所有测试

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

在浏览器中 本地主机: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

左侧还有更多错误。

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

正如 Vishal Gajjar 在评论中提到的,您在列名称中使用了保留关键字 desc,因此出现错误,这不是烘烤错误,而是您的错误。

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

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

另见

使用这个:

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

如果您确实使用关键字,请将其放在方括号中 [ ]

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

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

完成后,您可以关闭自动引用:

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

如此糟糕的性能只会出现在有问题的查询上。