
本文讲解如何解决从数据库读取文本后在html中显示格式错乱的问题,包括换行丢失、xss风险及sql注入隐患,并提供使用 nl2br()、htmlspecialchars() 和预处理语句的完整实践方案。
本文讲解如何解决从数据库读取文本后在html中显示格式错乱的问题,包括换行丢失、xss风险及sql注入隐患,并提供使用 nl2br()、htmlspecialchars() 和预处理语句的完整实践方案。
在Web开发中,将用户输入的多行文本(如配方步骤、产品描述等)存入数据库并原样展示在HTML页面上,是一个常见但易出错的场景。你遇到的“文本格式不好”,典型表现为:段落缩进消失、换行符(\n)未被渲染为
、特殊字符(如 、&)导致HTML结构被破坏,甚至可能引入XSS攻击风险。
根本原因有三:
✅ 换行符未转换:MySQL 存储的 \n 在HTML中默认不换行,需显式转为
;
✅ 输出未转义:直接 echo $tbl[4] 会将 <script> 等标签直接执行,危及安全;<br />
✅ <strong>SQL拼接风险:"SELECT * FROM ... WHERE id_gw=$id" 属于危险的字符串拼接,极易遭受SQL注入攻击。</script>
✅ 正确做法:三步加固
1. 使用预处理语句防止SQL注入
替换原始 $r=$db->prepare("SELECT * FROM ... WHERE id_gw=$id") 为参数化查询:
$r = $db->prepare("SELECT * FROM GREENWORK WHERE id_gw = ?");
$r->execute([$id]);
$tbl = $r->fetch();
⚠️ 注意:? 占位符自动处理类型与转义,绝不可再用 "$id" 拼接。
2. 用 nl2br() 恢复换行格式
将数据库中的 \n 转为 HTML 可识别的
:
<?php echo nl2br(htmlspecialchars($tbl[4])); ?>
3. 用 htmlspecialchars() 防XSS并保留可读性
它将 phpcn、> → >、& → & 等,既阻止脚本执行,又确保文本内容清晰可见(不会被浏览器误解析为标签)。
✅ 完整安全示例(整合修复)
<?php if (isset($_GET['id'])) {
$id = (int)$_GET['id']; // 强制转整型,双重防护
include('dbconnexion.php');
try {
$r = $db->prepare("SELECT * FROM GREENWORK WHERE id_gw = ?");
$r->execute([$id]);
$tbl = $r->fetch();
if (!$tbl) {
die("记录不存在");
}
} catch (PDOException $err) {
error_log("数据库查询失败: " . $err->getMessage());
die("系统繁忙,请稍后重试");
}
}
?>
<div class="container-fluid">
<h5>Les ingrédients :</h5>
<p><?php echo nl2br(htmlspecialchars($tbl[3] ?? '')); ?></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a>
<p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<h5>La description :</h5>
<p><?php echo nl2br(htmlspecialchars($tbl[4] ?? '')); ?></p>
</div>
? 额外建议
- 字段类型检查:若文本超长(如含大段说明),确认数据库列类型为 TEXT、MEDIUMTEXT 或 LONGTEXT,避免 VARCHAR(255) 截断;
- 前端增强:对长文本可配合 CSS 如 white-space: pre-line; 辅助排版;
- 内容审核:生产环境建议搭配富文本编辑器(如 TinyMCE)+ 后端白名单过滤,而非直接存储原始HTML。
遵循以上方案,即可兼顾安全性、可读性与兼容性,让数据库中的文本在网页中精准、安全、美观地呈现。










