具有bindParam()的PDO返回语法错误

时间:2019-07-04 07:49:51

标签: mysql pdo mariadb

我正在对MariaDB数据库进行PDO UPDATE查询。

$query = "UPDATE :table 
                        SET `name`=:name, 
                            `title`=:title,
                            `description`=:description 
                        WHERE id=:id";

            $stmt = $this->conn->prepare($query);

            $stmt->bindParam(':table',$this->table, PDO::PARAM_STR);
            $stmt->bindParam(':id',$this->id, PDO::PARAM_INT);
            $stmt->bindParam(':name',$this->name, PDO::PARAM_STR);
            $stmt->bindParam(':title',$this->title, PDO::PARAM_STR);
            $stmt->bindParam(':description',$this->description, PDO::PARAM_STR);

            $stmt->execute();

在我看来,一切看起来都很好,但是我确实得到了一个错误:

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 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 ''category' SET `name`='Snowboards', ' at line 1 in C:\xampp\htdocs\supershop\public\api\models\Category.php on line 109

如果我在phpMyAdmin中进行简单的SQL查询,一切都很好:

UPDATE
    `category`
SET
    `name` = 'Snowboards',
    `title` = 'Title',
    `description` = 'Description'
WHERE
    `id` = 9

这些绑定在做什么?

2 个答案:

答案 0 :(得分:3)

can't paramatise table names使用PDO。

您将需要清理表名并将其插入SQL字符串中。

"UPDATE ".$this->table."
SET `name`=:name, 
`title`=:title,
`description`=:description 
WHERE id=:id";

您可以看到引号放在'category'周围

答案 1 :(得分:0)

由于表名不能用作参数,因此触发了错误。如果要清理/过滤表名,可以手动进行。

一种方法是将表名白名单维护为数组。也就是说,将可接受的表名映射到具有与潜在用户输入对应的键的数组。

例如

array('u'=>users', 't'=>'table', 'c'=>comments')

这样,没有未经处理的数据将直接进入查询。

礼貌: