【问题标题】:How to safely use reserved SQL names?如何安全地使用保留的 SQL 名称?
【发布时间】:2015-01-09 05:24:00
【问题描述】:

我正在使用 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 的新手,英语不是我的母语,如果我不能正确解释我的问题,我很抱歉。提前致谢。

【问题讨论】:

  • 顺便说一句,我正在使用 sql server 2012
  • 我对cakephp一无所知,但是这里生成的语句中的问题是由于保留关键字'desc'。如果列名是“desc1”,它可以正常工作,或者如果您需要使用保留关键字,它应该用方括号括起来作为查询中的“Tests.[desc]”。
  • 感谢您的回复。这些代码和错误是由 cakephp 的 bake 命令生成的。我需要知道如何在我烘焙 MVC 时使 mysql 语句自动在 mssql 中转换。或者我只是缺少配置或其他东西。还是谢谢

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


【解决方案1】:

正如 Vishal Gajjar 在 cmets 中已经提到的,您使用保留关键字 desc 作为列名,因此出现错误,这不是错误,而是您的错误。

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

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

另见

【讨论】:

  • 对不起,我不能投票。我没有足够的声誉这样做。并感谢您提供详细的答案。我是个傻瓜,指责 cakephp 烘焙,尽管这是用户错误。再次感谢。
  • 感谢您的回答
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    使用这个:

    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
    

    如果您确实使用了关键字,请在方括号中使用它[ ]

    【讨论】:

    • 我会说这是因为问题不在于如何修复原始 SQL 语句,而是如何修复 CakePHP ORM 生成的 SQL。此外,已经两次提到了正确引用的必要性。
    • 哥们!你摇滚\m/
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2016-02-03
    相关资源
    最近更新 更多