留言板数据应存入MySQL的messages表,字段包括id(自增主键)、nickname(VARCHAR(20))、content(TEXT)和created_at(DATETIME默认当前时间),不存IP等不可靠字段;PHP需用trim、htmlspecialchars过滤并预处理,mysqli_prepare防注入;前端用fetch提交并更新DOM,显示时统一htmlspecialchars转义防XSS。

留言板数据怎么存,MySQL 表结构怎么设计
直接用文件存留言容易出乱码、并发写入丢数据,必须上数据库。建一张 messages 表就够了,字段别贪多:
-
id:自增主键,INT UNSIGNED AUTO_INCREMENT -
nickname:VARCHAR(20),不强制校验邮箱,昵称够用 -
content:TEXT,支持换行和少量 HTML(后面会过滤) -
created_at:DATETIME DEFAULT CURRENT_TIMESTAMP,别用time()函数拼字符串
别加 ip 或 user_agent 字段——没做登录,这些信息既难验证又容易被伪造,纯属增加维护负担。
PHP 后端怎么接收并插入留言
用 $_POST 接参,但不能直接入库。必须做三件事:过滤、截断、预处理。
- 用
trim()去首尾空格,再用strlen()判断是否为空,空内容直接die("内容不能为空") -
nickname用htmlspecialchars($nick, ENT_QUOTES, 'UTF-8')转义,防 XSS;content同理,但别用strip_tags()——它会删掉合法换行,改用nl2br()配合转义更稳妥 - 插入前用
mysqli_prepare()+bind_param(),参数类型对应好:s(string)给 nickname,s给 content
别手拼 SQL 字符串,哪怕只是测试环境。一句 "INSERT INTO messages VALUES ('" . $_POST['nick'] . "', ...)" 就是 SQL 注入入口。
立即学习“PHP免费学习笔记(深入)”;
前端表单提交后怎么不跳转还能刷新列表
用 fetch() 发 POST 请求,成功后清空输入框并重新拉取最新 10 条留言,而不是整个页面 reload。
- 表单
加onsubmit="handleSubmit(event)",第一句必须是event.preventDefault() -
fetch('save.php', { method: 'POST', body: new FormData(form) }),别漏Content-Type头——FormData会自动设为multipart/form-data,后端用$_POST照常收 - 响应返回 JSON,例如
{"status":"success","id":123},前端只管更新 DOM,不用解析 HTML 片段
别用 location.reload() 刷页面——用户刚输完字,一刷新全没了,体验极差。
显示留言时怎么避免 XSS 和样式错乱
所有从数据库读出的 content 和 nickname,在 echo 到 HTML 前必须过 htmlspecialchars(),且编码明确指定 'UTF-8'。
- 模板里写
- 别信“我只让用户输中文就没问题”——复制粘贴带控制字符、浏览器自动补全填入 script 标签,都发生过
- CSS 用类名隔离,比如给留言容器加
overflow-wrap: break-word;,防止超长英文单词撑爆布局
最常漏的是 ENT_QUOTES 参数——少了它,双引号属性值里的内容可能提前闭合标签,XSS 就藏在这儿。











