为了账号安全,请及时绑定邮箱和手机立即绑定

使用 PHP / PDO 更新表迭代数组

使用 PHP / PDO 更新表迭代数组

PHP
哆啦的时光机 2022-05-27 16:06:41
这里有类似的问题和一些相当复杂的答案。我不认为它应该那么复杂。也许是的。我是 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中描述的表中获取列名列表并将该查询的结果用作您的白名单。


查看完整回答
反对 回复 2022-05-27
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信