本文详解如何将动态生成的 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;
? 关键注意事项: