使用 PHP / PDO 更新表迭代数组 [重复]
Posted
技术标签:
【中文标题】使用 PHP / PDO 更新表迭代数组 [重复]【英文标题】:Update Table Iterating Array Using PHP / PDO [duplicate] 【发布时间】:2020-03-23 17:38:57 【问题描述】:这里有类似的问题和一些相当复杂的答案。我不相信它应该那么复杂。也许是的。我是 PDO 的新手。我有一组键值对。我需要用这些值更新记录。有没有更智能的方法来做到这一点?
$sql = "UPDATE Table SET ? = ? WHERE ID = ?";
$stmt = $pdo->prepare($sql);
foreach($QueryString as $Key=>$Value)
$stmt->execute($Key, $Value, $RecordID);
【问题讨论】:
【参考方案1】:您无法将值绑定到列名,因此您当前的代码根本无法工作。形成该查询以一次进行所有更新也会更有效,例如:
$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 中所述,并将该查询的结果用作您的白名单。
【讨论】:
完美!谢谢。 @RationalRabbit 不用担心 - 我很高兴能帮上忙。 也喜欢你处理结尾逗号的方式。我总是在最后一个字符串上做一个 substr 来删除它。一直认为一定有更好的方法。 抱歉,错过了第二部分。已恢复。 @RationalRabbit 我喜欢处理它的另一种方式是创建一个数组,例如$upd[] = " `$Key` = ?";
然后$sql .= implode(',', $upd);
以上是关于使用 PHP / PDO 更新表迭代数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章