
本文讲解如何将动态生成的 html 字符串(如患者信息表格)正确序列化为 json,避免手动拼接导致的格式错误、转义缺失和 xss/sql 注入风险。核心是全程使用 `json_encode()` 处理数据结构,而非字符串拼接。
在 Web 开发中,常需将 HTML 内容(例如患者档案表格)作为字符串嵌入 JSON API 响应中供前端渲染。但若处理不当——尤其是通过字符串拼接构造 JSON——极易引发解析失败、特殊字符未转义、换行符干扰或安全漏洞。
你遇到的错误正是典型问题:原始代码中使用了 '"entities": ' . $jasondata . '}' 手动拼接 JSON,导致:
- HTML 中的双引号 "、斜杠 /、换行符 \r\n 和制表符 \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 = '| Fullname | salum said juma |
| Age / sex | 12 male |
| Address | kariakoo dsm |
| File number | mn234 |
| kitu package | scheme name |
| kitu number | 1234567890 |
| kiyutu | 1919181716151 |
| hihi in | 12-03-2023 |
| hihi out | 12-03-2023 |
? 关键注意事项:
- 绝不手动拼接 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)正确消费的有效负载。











