我正在对 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
我对这些绑定做错了什么?
您需要清理表名称并插入到 SQL 字符串中。
"UPDATE ".$this->table."
SET `name`=:name,
`title`=:title,
`description`=:description
WHERE id=:id";
您可以看到周围的引号
'category'
由于表名不能作为参数而触发错误。如果您想清理/过滤表名,您可以手动执行。
一种方法是将表名白名单维护为数组。即,将可接受的表名称映射到具有与潜在用户输入相对应的键的数组。
例如
array('u'=>users', 't'=>'table', 'c'=>comments')
这样,未经处理的数据就不会直接进入查询。
礼貌: