
本文介绍在 php 中正确解析、修改 json 数据(尤其是嵌套结构中的字符串替换),再序列化回合法 json 并持久化到数据库的完整流程,避免因引用丢失或编码问题导致数据损坏。
本文介绍在 php 中正确解析、修改 json 数据(尤其是嵌套结构中的字符串替换),再序列化回合法 json 并持久化到数据库的完整流程,避免因引用丢失或编码问题导致数据损坏。
在 WordPress 或其他 PHP 应用中,常需从数据库读取 JSON 格式字段(如 wpdatatables_rows.data),对其中特定占位符(如 "%%REPLACEME%%")进行多语言路径替换,再将修改后的结构安全写回数据库。关键在于:不能仅对字符串做简单 str_replace(),而必须完整解析 → 深度修改 → 重新编码,否则易引发 JSON 格式破坏、Unicode 乱码或数据丢失。
✅ 正确操作步骤
-
使用 json_decode(..., true) 安全解析
启用关联数组模式,并传入 JSON_UNESCAPED_UNICODE 防止中文等 Unicode 字符被转义为 \uXXXX:$decoded_json = json_decode($data_json, true, JSON_UNESCAPED_UNICODE); if (json_last_error() !== JSON_ERROR_NONE) { error_log("Invalid JSON in row ID {$id}: " . json_last_error_msg()); continue; } -
精准定位并修改嵌套值(关键:使用引用 &$data)
原代码中 foreach($datas as $data) 是值拷贝,修改 $data['data'] 不会影响原数组。必须用引用确保变更同步到 $decoded_json:foreach ($decoded_json['cells'] as &$cell) { $cell['data'] = str_replace('%%REPLACEME%%', $string, $cell['data']); } // 注意:循环后建议 unset 引用,避免意外副作用 unset($cell); -
重新编码为标准 JSON 字符串
使用 json_encode() 并再次指定 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,确保 URL 中的 / 和中文不被转义:$updated_json = json_encode($decoded_json, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($updated_json === false) { error_log("JSON encode failed for ID {$id}: " . json_last_error_msg()); continue; } -
安全写入数据库(防 SQL 注入)
务必使用 $wpdb->prepare() 绑定参数:$table_name = $wpdb->prefix . 'wpdatatables_rows'; $wpdb->query( $wpdb->prepare("UPDATE {$table_name} SET data = %s WHERE id = %d", $updated_json, $id) );
⚠️ 注意事项
- 永远验证 JSON 解析结果:json_decode() 失败时返回 null,直接访问 ['cells'] 会触发 Notice。
- 避免直接字符串替换原始 JSON:对未解析的 JSON 字符串执行 str_replace() 可能误改 key 名、字符串内嵌内容或破坏引号结构。
- 处理特殊字符:若 $string 含双引号、反斜杠等,需确保其本身已正确转义(通常来自可信配置,无需额外 escape)。
- 性能提示:大量数据时,考虑批量更新或数据库层 REPLACE()(但 JSON 结构复杂时不推荐)。
通过以上方法,你不仅能精准替换 HTML 链接中的占位符,还能确保整个 JSON 结构完整性、Unicode 安全性及数据库写入可靠性。











