这里有类似的问题和一些相当复杂的答案。我不认为它应该那么复杂。也许是的。我是 PDO 的新手。我有一组键值对。我需要用这些值更新记录。有没有更智能的方法来做到这一点?$sql = "UPDATE Table SET ? = ? WHERE ID = ?";$stmt = $pdo->prepare($sql);foreach($QueryString as $Key=>$Value){ $stmt->execute($Key, $Value, $RecordID);}
1 回答
GCT1015
TA贡献1827条经验 获得超4个赞
您不能将值绑定到列名,因此您当前的代码根本无法工作。形成该查询以一次进行所有更新也会更有效,例如:
$sql = "UPDATE Table SET";
$v = 0;
foreach ($QueryString as $Key=>$Value) {
if ($v++ > 0) $sql .= ',';
$sql .= " `$Key` = ?";
}
$sql .= " WHERE ID = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(array_merge(array_values($QueryString), array($RecordID)));
$QueryString请注意,如果数组的键来自外部来源,则此查询仍然容易受到注入。为避免此问题,您应该检查列是否实际存在,或者使用手动指定的白名单,例如
$colnames = ['col1', 'col2', 'col3'];
foreach ($QueryString as $Key=>$Value) {
if (!in_array($Key, $colnames)) {
// abort
}
if ($v++ > 0) $sql .= ',';
$sql .= " `$Key` = ?";
}
或者通过从这个问题information_schema.columns中描述的表中获取列名列表并将该查询的结果用作您的白名单。
- 1 回答
- 0 关注
- 100 浏览
添加回答
举报
0/150
提交
取消