【问题标题】:CakePHP 3 + ORM Query builder and column name escapeCakePHP 3 + ORM 查询构建器和列名转义
【发布时间】:2018-07-15 19:28:51
【问题描述】:

A 已经将一些应用程序从 CakePHP 2 改写为 CakePHP 3。我在数据库中有一些结构,列有:key(自动生成的密钥字符串)。在 mysql 中,键是一个关键字,所以当我编写 SQL 查询时,我必须将其转义为

INSERT INTO table (`key`) VALUES (....)

不幸的是,当我尝试保存实体时,我收到一个错误:

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key, 

该错误是在 Cake\ORM\Table 中的 _insert() 方法中触发的:

$statement = $this->query()->insert(array_keys($data))
        ->values($data)
        ->execute();

有什么建议可以避免这种情况吗? CakePHP 3.5.11 版

【问题讨论】:

  • 你的mariadb好像有问题,可能需要去掉括号。
  • 好的,我用谷歌搜索得更深入,我发现问题是:quoteIdentifiers 数据库配置中的参数。它应该设置为true。

标签: sql cakephp cakephp-3.x quoting reserved-words


【解决方案1】:

要么重命名列以避免这种冲突,要么启用 CakePHPs 自动标识符引用,或者通过 quoteIdentifiers 选项在数据库连接配置中全局启用:

// in config/app.php

'Datasources' => [
    'default' => [
        // ...
        'quoteIdentifiers' => true,
    ],

    // ...
]

或仅通过动态切换驱动程序自动引用标志来执行该特定操作:

$driver = $this->getConnection()->getDriver();
$autoQuouting = $driver->isAutoQuotingEnabled();
$driver->enableAutoQuoting(true);

$this->query()/* ... */;

$driver->enableAutoQuoting($autoQuouting);

或通过手动引用名称并以引用方式传递它:

$connection = $this->getConnection();
$quotedColumnName = $connection->quoteIdentifier($columnName);
// ...

这目前与自动引用兼容,即如果启用自动引用,则引用的名称不会被引用两次,但我不确定这是否真的是一个承诺的行为!

另见

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多