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
相关产品推荐
相关产品推荐

