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

问题描述 投票:0回答:2

我正在对 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

我对这些绑定做错了什么?

php mysql pdo mariadb
2个回答
3
投票

无法使用 PDO 参数化表名称

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

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

您可以看到周围的引号

'category'


-1
投票

由于表名不能作为参数而触发错误。如果您想清理/过滤表名,您可以手动执行。

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

例如

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

这样,未经处理的数据就不会直接进入查询。

礼貌:

© www.soinside.com 2019 - 2024. All rights reserved.