mysql update字段,其值为另一个字段*和*在foreach循环内的准备语句中使用replace

y53ybaqx  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(299)

初始问题(稍后扩展-见下文):
是否可以用另一个字段中的值更新一个字段,并在该过程中替换更新值中的字符串?
我尝试了以下方法(非常简单):

UPDATE table1 SET field1 = REPLACE(field2, string1, string2);

例子: field2 包含“深蓝”, string1 是“蓝色”, string2 是“红色”。
我希望所有的价值观 field2 复制到 field1 ,但在复制时替换 string1 替换为 string2field1 . 所以在我的例子中 field2 应该变成“暗红色”。
但这只复制了 field2 进入 field1 ,无任何更换/变更(在我的例子中 field2 变成“深蓝色”)
编辑/添加:
@axiac和@2srtvf在他们的评论中创建并链接到的fiddle向我表明,我发布的代码实际上是有效的。非常感谢你们!
但是,我的原始代码嵌入在一个准备好的语句中。另外,仅准备好的语句就可以按预期工作。但这份事先准备好的声明 foreach 循环,在这种情况下更新查询不起作用。。。
下面是我实际使用的代码:

$db = new mysqli("my_host", "my_user", "my_pw", "my_database");

foreach($my_array AS $x=>$y) {
  if($ps = $db->prepare("UPDATE table1 SET field1 = REPLACE(field2, ?, ?) ")) {
    $ps->bind_param("ss", $x, $y);
    $ps->execute();
    $ps->close();
  }
}

数组包含键/值对,在我上面的示例中,其中一个是 blue / red .

lnlaulya

lnlaulya1#

你的问题是你的循环。所有第一次发生的替换 count($my_array)-1 通过循环的过程被最后一个过程丢弃,因为 UPDATE 总是从的当前值复制 field2 ,而不是以前修改过的 field1 . 尝试在循环之前添加以下内容:

UPDATE table1 SET field1 = field2

然后将循环中的查询更改为:

UPDATE table1 SET field1 = REPLACE(field1, ?, ?)

请注意,通过在循环中准备查询,您将失去准备好的查询的效率优势。最好写为:

if ($ps = $db->prepare("UPDATE table1 SET field1 = REPLACE(field1, ?, ?) ")) {
    foreach ($my_array as $x => $y) {
        $ps->bind_param("ss", $x, $y);
        $ps->execute();
    }
    $ps->close();
}

例如,如果您的表包含

field1  field2
x       dark blue
y       light green

以及 $my_array = array('blue' => 'red', 'green' => 'pink') 运行此代码后,您将得到:

field1      field2
dark red    dark blue
light pink  light green
92vpleto

92vpleto2#

单表更新分配通常从左到右进行计算。你能做的是:

UPDATE table1 SET field1 = field2, field2 = REPLACE(field2, string1, string2);

相关问题