如何在PHP MySQL预处理语句中执行UPDATE但不更新指定列?
如何用单条预处理UPDATE语句保留指定字段原有值?
当然可以实现,下面给你两种实用方案,既能复用同一个预处理语句,又能按需保留字段原有内容:
方案1:传入字段当前值
如果不需要更新某个字段,先从数据库里查出该字段的现有值,再把这个值作为参数传入执行语句。这样相当于把字段更新为它本身,自然不会改变原有内容。
修改你的代码示例(假设每条数据对应唯一的id):
// 先准备查询语句,用来获取字段当前值 $getCurrentNameStmt = $pdo->prepare("SELECT name FROM homes WHERE id = ?"); $figures = [ ['id' => 1, 'age' => 'foo1', 'name' => 'DO NOT UPDATE'], ['id' => 2, 'age' => 'foo1', 'name' => 'bar1'], ['id' => 3, 'age' => 'foo2', 'name' => 'bar2'] ]; // 复用同一个UPDATE预处理语句 $updateStmt = $pdo->prepare("UPDATE homes SET age = ?, name = ? WHERE id = ?"); foreach ($figures as $row) { $nameVal = $row['name']; // 遇到标记时,查询当前name值 if ($nameVal === 'DO NOT UPDATE') { $getCurrentNameStmt->execute([$row['id']]); $nameVal = $getCurrentNameStmt->fetchColumn(); } $updateStmt->execute([$row['age'], $nameVal, $row['id']]); }
方案2:在SQL语句中加入条件判断
直接在UPDATE语句里写逻辑判断,当参数是“DO NOT UPDATE”标记时,保留字段原有值,无需额外查询,效率更高:
$figures = [ ['id' => 1, 'age' => 'foo1', 'name' => 'DO NOT UPDATE'], ['id' => 2, 'age' => 'foo1', 'name' => 'bar1'], ['id' => 3, 'age' => 'foo2', 'name' => 'bar2'] ]; // 用IF函数做判断,标记匹配时保留原字段值 $updateStmt = $pdo->prepare("UPDATE homes SET age = ?, name = IF(? = 'DO NOT UPDATE', name, ?) WHERE id = ?"); foreach ($figures as $row) { $updateStmt->execute([ $row['age'], $row['name'], $row['name'], $row['id'] ]); }
如果有多个字段需要按需更新,只要给每个字段都加上类似的IF或CASE判断即可,全程复用同一个预处理语句。
内容的提问来源于stack exchange,提问作者Hasley
相关产品推荐
相关产品推荐

