首页 > 解决方案 > 在 PHP 中替换 MySQL 中的 JSON 数组

问题描述

我正在尝试在我的 MySQL 数据库中的 JSON 数组中替换 JSON 数组中的数据。

数组如下所示:

{"slug": "SLUG","price": "{"44":12,"_default":12}", "test": "TEST"}

现在我想更新价格数组中的两个字段。

我使用以下代码能够用字符串或数字替换价格数组,但我无法用另一个数组替换它:

$sql = "UPDATE products SET productDynamicFields = JSON_REPLACE(productDynamicFields,'$.price', '$test')
        Where productSlug = '$productSlug'";
$result = mysqli_query($link,$sql);

如您所见,我正在使用一个名为$test.

我尝试为变量提供以下值:$test = ['44' => 13, '_default' => 13];然后像这样对其进行编码:$test = json_encode($test);

但现在在我的数据库中,它看起来像这样:

"price": "{\"44\":13,\"_default\":13}

我现在尝试使用JSON_UNESCAPED_SLASHES没有成功。

怎么做才能实现数组里面的数组?

标签: phpmysqlsqlarraysjson

解决方案


与其从 php 生成 json 并尝试将其传递给 MySQL,不如使用 MySQL 函数json_object()生成有效的 json 对象:

update t
set js = json_replace(js, '$.price', json_object('44', 13, '_default', 13))

DB Fiddlde 上的演示

create table t (js json);
insert into t values('{"slug": "SLUG","price": {"44":12,"_default":12}, "test": "TEST"}');

update t
set js = json_replace(js, '$.price', json_object('44', 13, '_default', 13));

select * from t
| js |
| :------------------------------------------------ ------------------- |
| {“slug”:“SLUG”,“test”:“TEST”,“price”:{“44”:13,“_default”:13}} |

笔记:

数组如下所示:

{"slug": "SLUG","price": "{"44":12,"_default":12}", "test": "TEST"}

  • 这是一个 json对象(在 key 下有一个嵌入的 json 对象"price"),而不是一个 json 数组

  • 你在嵌入的对象周围有额外的双引号导致 json 无效,我认为这是一个错字并删除了它们


推荐阅读