为啥反引号在 PDO 查询中失败? [复制]

Posted

技术标签:

【中文标题】为啥反引号在 PDO 查询中失败? [复制]【英文标题】:Why does backticks fails in PDO query? [duplicate]为什么反引号在 PDO 查询中失败? [复制] 【发布时间】:2015-04-13 04:53:51 【问题描述】:

我有一个名称中带有连字符的表格,但我无法更改表格名称,所以我认为反引号会有所帮助。

不幸的是,它失败了,一些谷歌搜索没有给我任何答案。我该如何解决这个问题?

例如:

    $stmt = $this->_dbh->prepare(
        'UPDATE `:table`
        SET status = NOT status
        WHERE id=:id;');


    $stmt->bindParam(':table',$this->_settings['table'], PDO::PARAM_STR);
    $stmt->bindParam(':id',$data['id'], PDO::PARAM_INT);
    if( $stmt->execute() )
        return 'Success';
    
    else
        $this->_log( $stmt->errorInfo() );
        return 'Action failed.';
    

在日志中,带有反引号:

13:25:18    42S02
1146
Table 'db_name.'table-name'' doesn't exist

没有反引号:

13:38:14    42000
1064
You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near ''table-name'
            SET status = NOT status
            WHERE id='1'' at line 1

【问题讨论】:

因为你不能绑定表/列名......并且字符串绑定变量被引号包裹为绑定的一部分 可能重复:***.com/q/15182910/3933332 你是说 bindParam(); 那么@MarkBaker 是否有一种最佳实践方法可以将变量用于表名或列名?顺便说一句,已经解决了问题。谢谢! 查看我的答案,尽管这些天我个人使用 ORM 来完成我的大部分数据库工作 【参考方案1】:

如果需要注入表名,不能作为绑定变量进行;只要值被列入白名单,就可以使用

$stmt = $this->_dbh->prepare(
        sprint(
            'UPDATE `%s`
                SET status = NOT status
              WHERE id=:id;',
            $this->_settings['table']
        )
    );


$stmt->bindParam(':id',$data['id'], PDO::PARAM_INT);

【讨论】:

谢谢!这太棒了!

以上是关于为啥反引号在 PDO 查询中失败? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥SQL支持两个单引号以及反斜杠转义

为啥 IntelliJ 不断从这个 JavaScript 模板字符串中删除反引号?

Hive SQL中关于反引号的使用

查询中的 TypeORM、反引号与冒号

反引号和单引号有啥区别?我可以在上面的查询中使用 IF 语句吗?

为啥我不能在 Python 中反序列化带有单引号的 JSON 字符串?