代码之家  ›  专栏  ›  技术社区  ›  Johannes

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

  •  0
  • Johannes  · 技术社区  · 6 年前

    初始问题(稍后扩展-见下文):

    是否可以用另一个字段中的值更新字段,并在此过程中替换该更新值中的字符串?

    我尝试了以下方法(非常简单):

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

    例子: field2 包含“深蓝”, string1 是“蓝色”, string2 是“红色”。

    我期望所有的价值 第二场 被复制到 field1 ,但复制时替换的任何实例 STRIGE1 替换为 STRIGN2 在里面 第一场 . 所以在我的例子中, 第二场 应该变成“暗红色”。

    但这只复制了 第二场 进入之内 第一场 ,无任何更换/变更。(在我的例子中 第二场 变成“深蓝色”)。


    编辑/添加:

    @axiac和@2srtf在他们的评论中创建并链接到的小提琴告诉我,我发布的代码实际上是有效的。非常感谢你们俩!

    然而,我的 起初的 代码嵌入在准备好的语句中。另外,仅准备好的声明就可以按预期工作。但准备好的声明在 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 .

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nick    6 年前

    你的问题是你的循环。第一次更换的所有部件 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
    
        2
  •  0
  •   Sookie Singh    6 年前

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

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