php - 为什么反引号在 PDO 查询中失败?

标签 php mysql pdo backticks

<分区>

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

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

例如:

    $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

最佳答案

如果需要注入(inject)表名,不能作为绑定(bind)变量来做;只要该值已列入白名单,就可以使用

$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);

关于php - 为什么反引号在 PDO 查询中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477730/

相关文章:

php - 我的注册表详细信息未进入数据库(phpmyadmin)

php - 插入 pdo 前清空表

php - 调用未定义的方法 PDO::execute()

linux - 如何以 root 身份运行 php-fpm

php - 如果 varchar 字段的值大于 9999,Mysql 'between' 条件不起作用

php - Yii CGridView 为标题单元格添加类或样式

php - 如何修复错误 500

mysql - 在MySQL中实现继承:替代方案和仅具有代理键的表

php - 如何在任何表中添加一系列递增id的字符串?

php - PHP 中的 MySQL;比较前编辑列值