You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP修改数据库JSON字符串后如何重新编码写回数据库

问题根源

你现有代码无法完成JSON回写的原因有两个:

  • 遍历单元格数组时使用值传递,字符串替换的结果只存在于临时变量中,没有修改解码后的原始JSON数组
  • 完成替换后没有将数组重新编码为JSON格式,也没有执行数据库更新操作
修复后可直接运行的代码
$rep = "%%REPLACEME%%";
$field = 'locale';
$current_lang = pll_current_language($field);

switch ($current_lang) {
    case "fr_FR":
        $replace_str = "reservation/";
        break;
    case "en_GB":
        $replace_str = "en/book/";
        break;
    case "es_ES":
        $replace_str = "es/reservar/";
        break;
    default:
        $replace_str = "reservation/";
        break;
}

$table_name = $wpdb->prefix . 'wpdatatables_rows';
$rows = $wpdb->get_results("SELECT id, data FROM $table_name");

foreach ($rows as $row) {
    // 解码JSON为关联数组
    $row_data = json_decode($row->data, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        continue; // 跳过JSON格式损坏的行,避免报错
    }

    // 引用遍历直接修改原数组内的单元格内容
    foreach ($row_data['cells'] as &$cell) {
        $cell['data'] = str_replace($rep, $replace_str, $cell['data']);
    }
    unset($cell); // 释放引用,防止后续逻辑污染数组

    // 重新编码为JSON,保留斜杠不转义,匹配原存储格式
    $new_json = json_encode($row_data, JSON_UNESCAPED_SLASHES);

    // 写回数据库
    $wpdb->update(
        $table_name,
        ['data' => $new_json],
        ['id' => $row->id],
        ['%s'],
        ['%d']
    );
}
注意事项
  • 遍历数组时加&代表引用传递,对$cell的修改会直接作用到原数组上,遍历结束后必须unset($cell),否则会出现不可预期的数组值覆盖问题
  • 编码时加JSON_UNESCAPED_SLASHES参数,不会转义HTML链接里的/符号,和wpDataTables原生存储的JSON格式完全一致,避免插件读取数据时解析失败
  • 增加了JSON格式校验,遇到损坏的行直接跳过,不会中断整个脚本运行
  • 使用WordPress原生的$wpdb->update方法操作数据库,自动完成SQL转义,避免手写SQL带来的注入风险

内容的提问来源于stack exchange,提问作者ilanb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:33:20