使用PHP / PDO更新表迭代数组[重复]

问题描述 投票:1回答:1
这里有类似的问题,还有一些相当复杂的答案。我不认为它应该那么复杂。也许是。我是PDO的新手。我有一组键值对。我需要使用这些值更新记录。有没有更聪明的方法可以做到这一点?

$sql = "UPDATE Table SET ? = ? WHERE ID = ?"; $stmt = $pdo->prepare($sql); foreach($QueryString as $Key=>$Value) { $stmt->execute($Key, $Value, $RecordID); }

php pdo
1个回答
3
投票
您无法将值绑定到列名称,因此您当前的代码根本无法使用。形成该查询以一次进行所有更新的效率也更高,例如:

$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中所述的从question表中获取列名的列表,并将该查询的结果用作白名单。
© www.soinside.com 2019 - 2024. All rights reserved.