如何安全地使用保留的 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);
如此糟糕的性能只会出现在有问题的查询上。
我正在使用 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);
如此糟糕的性能只会出现在有问题的查询上。