【问题标题】:Updating an unknown number of unknown fields with unknown values using PDO?使用 PDO 使用未知值更新未知数量的未知字段?
【发布时间】:2013-12-31 11:30:24
【问题描述】:

我正在尝试将一条记录更新到我不提前知道要更新的字段、要更新的字段或这些字段将包含什么值的表中 - 其中一些将被设置为空。

我选择记录之前的记录和更改后的记录之间的变化,而不是简单地更新整个记录(考虑到任何时候只有一个字段可能会发生变化,这样做似乎毫无意义)。

这些记录的更改保存在我的$changes 数组中,其中键是字段名称,值是字段需要保存的新值。我曾尝试研究使用问号表示法来记录未知值,但仅此一项并不能说明可能更新多少字段的差异,而且我只看到此表示法与选择查询一起使用。

这是我目前所得到的:

$dbh->prepare("UPDATE `missions` SET ??? WHERE `mission_id`=:mission_id");
$dbh->bindParam(':mission_id', $mission_id); // Mission ID is constant and WILL NOT change

我知道我可以简单地循环遍历我的数组来绑定参数,但我不知道如何将我的更改值数组转换为问号所需的符号。想法和想法?

【问题讨论】:

  • 你需要使用准备好的语句吗?否则我只会将查询创建为字符串并直接执行。
  • @MatthiasDunkel 我的印象是不使用准备好的语句打开了 SQL 注入的大门,如果有机会,我想阻止这种情况。
  • @MatthiasDunkel 每个人都需要使用准备好的语句。
  • @YourCommonSense 您不应该总是使用准备好的语句。也有例外,可能是这样。这取决于数据的来源以及您是否信任来源...

标签: php mysql arrays pdo


【解决方案1】:

您将不得不对此进行一些试验,但这应该会让您非常接近:

// Unknown name and number of changes
$changes = array(
    'col1' => 'first',
    'col4' => 'fourth',
    'col7' => 'seventh',
);

$setSql = array();

// Create named params, nicer than positional params
foreach ($changes as $column => $value) {
    $setSql[] = "`{$column}` = :{$column}";
}

// Use implode to create the 'set' string
$setString = implode(', ', $setSql);
var_dump($setString);
// string(46) "`col1` = :col1, `col4` = :col4, `col7` = :col7"

// Add the mission_id to the end of the changes array
$changes['mission_id'] = 1234;

$sql = sprintf('UPDATE `missions` SET %s WHERE `mission_id` = :mission_id', $setString);
var_dump($sql);
// string(101) "UPDATE `missions` SET `col1` = :col1, `col4` = :col4, `col7` = :col7 WHERE `mission_id` = :mission_id"

$stmt = $dbh->prepare($sql);
$stmt->execute($changes);

【讨论】:

  • 完美:您节省了我的时间!我应该强迫自己更频繁地使用 sprintf,因为它很强大。不明白为什么它还不是公认的答案...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2013-02-21
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多