
本文讲解如何将动态生成的 html 字符串(如患者信息表格)正确序列化为 json,避免手动拼接导致的格式错误、转义缺失和 xss/sql 注入风险。核心是全程使用 `json_encode()` 处理数据结构,而非字符串拼接。
在 Web 开发中,常需将 html 内容(例如患者档案表格)作为字符串嵌入 jsON API 响应中供前端渲染。但若处理不当——尤其是通过字符串拼接构造 json——极易引发解析失败、特殊字符未转义、换行符干扰或安全漏洞。
你遇到的错误正是典型问题:原始代码中使用了 ‘”entities”: ‘ . $jasondata . ‘}’ 手动拼接 JSON,导致:
- HTML 中的双引号 “、斜杠 /、换行符 rn 和制表符 t 未被 JSON 标准转义;
- json_encode() 生成的 $jasondata 本身已是合法 JSON 字符串,再用字符串包裹会破坏嵌套结构;
- 最终输出不符合 JSON 规范(如键名未加引号、多余空格、非法控制字符),JSON Formatter 工具报错。
✅ 正确做法:始终将数据组织为 php 关联数组,再由 json_encode() 统一序列化。它会自动处理:
- 字符串内双引号转义为 “;
- 反斜杠、换行符、制表符等 Unicode 转义(如 n, t);
- 键名与字符串值强制加双引号;
- 确保整个输出严格符合 RFC 8259 JSON 标准。
以下是优化后的完整实现:
立即学习“前端免费学习笔记(深入)”;
// ✅ 安全、规范的 HTML + JSON 封装方式 $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 字符串(保持原逻辑,但建议后续考虑模板分离) function patient_file() { $html = ''; $html .= 'Fullname salum said juma '; $html .= 'Age / sex 12 male '; $html .= 'Address kariakoo dsm '; $html .= 'File number mn234 '; $html .= 'kitu package scheme name '; $html .= 'kitu number 1234567890 '; $html .= 'kiyutu 1919181716151 '; $html .= 'hihi in 12-03-2023 '; $html .= 'hihi out 12-03-2023 '; $html .= '
'; return $html; } // 构建结构化数据(非字符串拼接!) $data = [ 'entities' => [ array_merge($row, ['cardata' => patient_file()]) ] ]; // ✅ 单次 json_encode —— 安全、可靠、可读 header('Content-Type: application/json; charset=utf-8'); echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
? 关键注意事项:
- 绝不手动拼接 JSON:json_encode() 是唯一可信的 JSON 序列化入口,绕过它等于放弃标准兼容性与安全性;
- SQL 注入防护必须落实:mysqli_prepare() + bind_param() 是硬性要求,尤其当 $folio 来自用户输入(如 $_POST);
- HTML 字符串本身无需额外转义:json_encode() 会自动处理 , “, 等字符,前端接收后可直接插入 dom(但需确保前端渲染逻辑安全,如使用 textContent 或可信上下文);
- 推荐增强健壮性:添加 mysqli_error($conn2) 日志、空结果判断、JSON_THROW_ON_ERROR 标志(PHP 7.3+)捕获编码异常;
- 长期建议:将 HTML 模板移至独立 .php 文件或使用 Twig/Blade 等模板引擎,提升可维护性与 XSS 防御能力。
遵循以上实践,即可生成完全合规、可被任意 JSON 解析器(包括浏览器 JSON.parse()、postman、curl)正确消费的有效负载。