
本文讲解如何解决从数据库(如 text 类型字段)获取文本后在 html 中格式错乱的问题,包括换行丢失、html 标签未转义、sql 注入与 xss 风险等常见问题,并提供基于 pdo 的安全、规范的输出方案。
本文讲解如何解决从数据库(如 text 类型字段)获取文本后在 html 中格式错乱的问题,包括换行丢失、html 标签未转义、sql 注入与 xss 风险等常见问题,并提供基于 pdo 的安全、规范的输出方案。
在 Web 开发中,将用户输入的多行文本(如食材列表、产品描述)存入数据库的 TEXT 类型字段是常见做法。但直接使用 echo $tbl[4] 输出时,常出现两大问题:一是原始换行符(\n)在 HTML 中不生效(浏览器忽略纯换行),导致内容挤成一团;二是若文本含 <、>、& 等特殊字符,可能被误解析为 HTML 标签,引发布局错乱甚至 XSS 漏洞。
✅ 正确做法:组合使用 nl2br() 与 htmlspecialchars()
nl2br() 将换行符 \n 转换为 <br> 标签,确保段落结构可见;htmlspecialchars() 则对 <, >, ", ', & 进行实体编码,既保留原文本语义,又阻止 HTML 解析。二者顺序不可颠倒——必须先转义再换行,否则 <br> 可能被二次转义为
,失去作用。
修改你的输出代码如下:
<div class='container-fluid'> <h5>Les ingrédients :</h5> <p><?php echo nl2br(htmlspecialchars($tbl[3] ?? '')); ?></p> <h5>La description :</h5> <p><?php echo nl2br(htmlspecialchars($tbl[4] ?? '')); ?></p> </div>
⚠️ 关键安全与健壮性改进
立即学习“PHP免费学习笔记(深入)”;
-
防止 SQL 注入:原代码中 $id 直接拼入 SQL 字符串,存在严重风险。应改用参数化查询(预处理语句):
$r = $db->prepare("SELECT * FROM GREENWORK WHERE id_gw = ?"); $r->execute([$id]); $tbl = $r->fetch(); - 字段长度保障:若文本被意外截断,请检查数据库字段类型。TEXT(64KB)通常足够,但若内容超长,建议升级为 MEDIUMTEXT(16MB)或 LONGTEXT(4GB)。可通过 SHOW CREATE TABLE GREENWORK 确认。
- 空值防御:使用 ?? '' 提供默认空字符串,避免 Notice: Undefined index 错误。
- 大小写规范:HTML 标签名统一小写(如 <h5> 而非 <H5>),符合 HTML5 标准。
遵循以上实践,即可安全、清晰、可维护地呈现数据库中的文本内容——既尊重用户输入的格式意图,又筑牢 Web 安全防线。



















