我正在对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
这些绑定在做什么?
答案 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')
这样,没有未经处理的数据将直接进入查询。
礼貌: