
本文详解如何将动态生成的 html 内容(如表格)作为字符串字段正确编码进 json,避免转义错误、非法字符和 sql 注入风险,并提供完整、安全、可验证的实现方案。
在 Web 开发中,常需将 HTML 片段(如患者信息表)作为字符串字段嵌入 JSON 响应返回给前端(例如用于动态渲染或第三方 API 集成)。但直接拼接字符串再手动包裹 JSON 结构(如 '{"entities": ' . $json . '}')极易导致格式错误——正如问题中所示:HTML 中的换行符(\r\n)、斜杠(/)、引号及未转义的 符号会破坏 JSON 合法性,使 jsonformatter 报错,且前端 JSON.parse() 失败。
根本原因在于:JSON 必须严格遵循规范,所有字符串值(包括含 HTML 的字符串)必须由 json_encode() 统一处理,而非人工拼接。 PHP 的 json_encode() 会自动对特殊字符(如 ", \, /, 控制符等)进行标准转义,并确保 UTF-8 编码安全,这是任何字符串插值都无法替代的。
✅ 正确做法:全程使用 json_encode() 构建嵌套结构:
$folio = $_POST['folio'] ?? '';
// ✅ 使用预处理语句防止 SQL 注入(关键安全实践)
$stmt = mysqli_prepare($conn2, "SELECT * FROM m_folio WHERE m_No = ?");
mysqli_stmt_bind_param($stmt, "s", $folio); // 注意:若 m_No 是字符串类型,用 "s";若为整型,用 "i"
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);
// ✅ HTML 内容作为纯字符串赋值,不作任何手动转义
$row['cardata'] = patient_file();
// ✅ 全量结构由 json_encode() 一次性安全序列化
$payload = json_encode([
'entities' => [$row]
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// ✅ 输出前检查编码是否成功
if ($payload === false) {
http_response_code(500);
echo json_encode(['error' => 'JSON encoding failed: ' . json_last_error_msg()]);
exit;
}
header('Content-Type: application/json; charset=utf-8');
echo $payload;? 关键注意事项:
立即学习“前端免费学习笔记(深入)”;
- 绝不手动拼接 JSON 字符串:'{"entities": ' . $json . '}' 是高危反模式,即使 $json 本身是 json_encode() 生成的,外层拼接仍可能引入非法空白或编码不一致问题。
- HTML 字符串无需额外 htmlspecialchars() 或 addslashes():json_encode() 已负责全部转义;双重转义会导致前端显示原始 HTML 标签(如 zuojiankuohaophpcntableyoujiankuohaophpcn),而非渲染效果。
- 启用 JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES:避免中文乱码及不必要的 \/ 转义,提升可读性与兼容性。
- SQL 安全强制要求预处理语句:$_POST['folio'] 直接拼入 SQL 是严重漏洞,必须使用 mysqli_prepare() + bind_param()。
- 始终校验 json_encode() 返回值:失败时返回 false,应捕获并记录错误(如 json_last_error_msg())。
? 补充建议(提升健壮性):
若 HTML 内容来自不可信来源(如用户输入),应在生成前做 XSS 过滤(如使用 htmlspecialchars() 处理动态数据),但注意:该过滤应在 patient_file() 函数内部对变量值操作,而非对最终 HTML 字符串二次处理——否则会破坏标签结构。
综上,JSON 序列化的唯一可信入口是 json_encode()。坚持“数据组装 → 一次编码 → 安全输出”三步原则,即可彻底规避格式错误、注入风险与跨平台兼容问题。











