【问题标题】:Update Table Iterating Array Using PHP / PDO [duplicate]使用 PHP / PDO 更新表迭代数组 [重复]
【发布时间】: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);
}

【问题讨论】:

    标签: php pdo


    【解决方案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);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2020-07-12
    • 2013-07-06
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多