初始问题(稍后扩展-见下文):
是否可以用另一个字段中的值更新一个字段,并在该过程中替换更新值中的字符串?
我尝试了以下方法(非常简单):
UPDATE table1 SET field1 = REPLACE(field2, string1, string2);
例子: field2
包含“深蓝”, string1
是“蓝色”, string2
是“红色”。
我希望所有的价值观 field2
复制到 field1
,但在复制时替换 string1
替换为 string2
在 field1
. 所以在我的例子中 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
.
2条答案
按热度按时间lnlaulya1#
你的问题是你的循环。所有第一次发生的替换
count($my_array)-1
通过循环的过程被最后一个过程丢弃,因为UPDATE
总是从的当前值复制field2
,而不是以前修改过的field1
. 尝试在循环之前添加以下内容:然后将循环中的查询更改为:
请注意,通过在循环中准备查询,您将失去准备好的查询的效率优势。最好写为:
例如,如果您的表包含
以及
$my_array = array('blue' => 'red', 'green' => 'pink')
运行此代码后,您将得到:92vpleto2#
单表更新分配通常从左到右进行计算。你能做的是: