MYSQL 使用另一个字段的值更新字段 *和* 在 foreach 循环内的准备好的语句中使用 REPLACE
MYSQL UPDATE field with value of another field *and* using REPLACE in a prepared statement inside a foreach loop
初始问题(稍后扩展 - 见下文):
是否可以用另一个字段的值更新一个字段,并在该过程中替换该更新值中的字符串?
我尝试了以下(非常简单):
UPDATE table1 SET field1 = REPLACE(field2, string1, string2);
示例:field2
包含"dark blue",string1
是"blue",string2
是"red"。
我希望 field2
中的所有值都被复制到 field1
,但是在复制时将 string1
的任何实例替换为 field1
中的 string2
=].所以在我的例子中 field2
的值应该变成 "dark red".
但这只是将 field2
的未更改值复制到 field1
中,没有任何替换/更改。 (在我的示例中 field2
变为 "dark blue")
编辑/添加:
@axiac 和@2SRTVF 在他们的评论中创建并链接到的小提琴向我展示了我发布的代码确实有效。非常感谢你们!
但是,我的原始代码嵌入了准备好的语句中。此外,准备好的声明本身也能按预期工作。但是准备好的语句位于一个 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();
}
}
该数组包含 key/value 对,在我上面的示例中,其中一个是 blue / red
.
Single-table UPDATE 分配通常从左到右计算。您可以做的是:
UPDATE table1 SET field1 = field2, field2 = REPLACE(field2, string1, string2);
你的问题是你的循环。在第一个 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();
}
例如,如果您的 table 包含
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
初始问题(稍后扩展 - 见下文):
是否可以用另一个字段的值更新一个字段,并在该过程中替换该更新值中的字符串?
我尝试了以下(非常简单):
UPDATE table1 SET field1 = REPLACE(field2, string1, string2);
示例:field2
包含"dark blue",string1
是"blue",string2
是"red"。
我希望 field2
中的所有值都被复制到 field1
,但是在复制时将 string1
的任何实例替换为 field1
中的 string2
=].所以在我的例子中 field2
的值应该变成 "dark red".
但这只是将 field2
的未更改值复制到 field1
中,没有任何替换/更改。 (在我的示例中 field2
变为 "dark blue")
编辑/添加:
@axiac 和@2SRTVF 在他们的评论中创建并链接到的小提琴向我展示了我发布的代码确实有效。非常感谢你们!
但是,我的原始代码嵌入了准备好的语句中。此外,准备好的声明本身也能按预期工作。但是准备好的语句位于一个 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();
}
}
该数组包含 key/value 对,在我上面的示例中,其中一个是 blue / red
.
Single-table UPDATE 分配通常从左到右计算。您可以做的是:
UPDATE table1 SET field1 = field2, field2 = REPLACE(field2, string1, string2);
你的问题是你的循环。在第一个 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();
}
例如,如果您的 table 包含
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