使用 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 更新表迭代数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用数组的 PDO 更新表

无法使用 PHP 和 PDO 更新表

JS数组到PHP并使用PDO更新MYSQL中的表

PHP PDO更新多行[重复]

如何从另一个表更新mysql pdo中的字段[重复]

重复密钥更新时的 PDO 插入