
本文详解如何正确将动态生成的 html 字符串(如患者信息表格)作为字段值嵌入 json 响应,避免因手动拼接、未转义或编码不当导致的 json 格式错误。核心方案是全程使用 json_encode() 自动处理转义,禁用字符串拼接构造 json。
在 Web 开发中,常需将 HTML 片段(例如患者档案表格)作为数据字段返回给前端(如用于弹窗渲染或富文本展示)。但若直接将 HTML 字符串赋值给数组再 json_encode(),却仍出现 JSON 解析失败(如在 JSON Formatter 中报错),往往是因为:
- ✅ HTML 字符串本身含换行符(\n)、制表符(\t)、斜杠(/)或双引号(")等特殊字符;
- ❌ 手动拼接 JSON 字符串(如 '{"entities": ' . $jasondata . '}')极易破坏结构,且无法保证内部字符串的 JSON 合法性;
- ⚠️ 未对数据库查询做参数化处理,存在 SQL 注入风险。
正确做法:全链路交由 json_encode() 处理
PHP 的 json_encode() 默认会对字符串中的特殊字符(包括 , /, \n, \t, ", ' 等)自动进行 JSON 转义(如 "你唯一需要做的,是把所有数据组织成 PHP 关联数组,然后一次性 encode。
以下是重构后的完整示例:
// ✅ 安全读取 HTML(保持原逻辑,仅优化可读性)
function patient_file() {
return '<table style="width:100%; padding:0; margin:0; color:rgb(50,50,50);">
<tr><td style="width:17%"><b style="color:rgb(150,150,150)">Fullname</b></td><td>salum said juma</td></tr>
<tr><td><b style="color:rgb(150,150,150)">Age / sex</b></td><td>12 male</td></tr>
<tr><td><b style="color:rgb(150,150,150)">Address</b></td><td>kariakoo dsm</td></tr>
<tr><td><b style="color:rgb(150,150,150)">File number</b></td><td>mn234</td></tr>
<tr><td><b style="color:rgb(150,150,150)">kitu package</b></td><td>scheme name</td></tr>
<tr><td><b style="color:rgb(150,150,150)">kitu number</b></td><td>1234567890</td></tr>
<tr><td><b style="color:rgb(150,150,150)">kiyutu</b></td><td>1919181716151</td></tr>
<tr><td><b style="color:rgb(150,150,150)">hihi in</b></td><td>12-03-2023</td></tr>
<tr><td><b style="color:rgb(150,150,150)">hihi out</b></td><td>12-03-2023</td></tr>
</table>';
}
// ✅ 使用预处理语句防止 SQL 注入(假设 $folio 为整数;若为字符串,改用 "s")
$folio = (int)$_POST['folio']; // 强制类型转换兜底
$stmt = mysqli_prepare($conn2, "SELECT * FROM m_folio WHERE m_No = ?");
mysqli_stmt_bind_param($stmt, "i", $folio);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);
// ✅ 将 HTML 直接赋值为数组字段 —— json_encode 会自动转义
$row['cardata'] = patient_file();
// ✅ 构建顶层结构:["entities" => [...]],由 json_encode 统一编码
$payload = json_encode([
"entities" => [$row]
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// ✅ 输出前设置 Content-Type(推荐)
header('Content-Type: application/json; charset=utf-8');
echo $payload;关键注意事项
- 禁止字符串拼接 JSON:'{"entities": ' . $jasondata . '}' 是高危操作,即使 $jasondata 已 encode,外层手动拼接仍可能引入非法空白或引号冲突。
- 启用 JSON_UNESCAPED_UNICODE:避免中文被转为 \uXXXX,提升可读性与调试效率。
- 启用 JSON_UNESCAPED_SLASHES:防止 HTML 中的 / 被转义为 \/(虽合法但冗余)。
- SQL 安全必须前置:无论输入是否可信,$_POST['folio'] 都须通过预处理语句或强类型转换过滤。
-
验证输出:用 json_last_error() 检查编码结果:
if (json_last_error() !== JSON_ERROR_NONE) { error_log('JSON encode failed: ' . json_last_error_msg()); http_response_code(500); exit; }
遵循以上模式,你的 HTML 字符串将被安全、透明地嵌入 JSON,前端可直接解析 response.entities[0].cardata 并插入 DOM(注意使用 innerHTML 或框架的安全渲染机制),彻底规避格式错误与注入风险。
立即学习“前端免费学习笔记(深入)”;



















