表单提交后输入框需手动回填$_post值并转义,用htmlspecialchars($_post['field'] ?? '')防止未提交警告和xss;textarea内容置于标签体内;复选框通过检查value是否在$_post数组中决定checked状态。

表单提交后输入框清空,不是代码漏了,而是你没把 $_POST 里的值主动塞回 value 属性里——PHP 不会自动帮你做这件事。
PHP 中用 htmlspecialchars() 回填 value 属性
最直接的做法是在每个 <input> 标签的 value 属性中写 PHP 表达式,读取 $_POST 对应字段并转义输出:
<input type="text" name="username" value="<?php echo htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
关键点:
-
?? ''防止未提交时触发 “undefined index” 警告 -
htmlspecialchars()必须加,否则用户输入<script>alert(1)</script>会直接执行 - 编码参数推荐显式写全:
ENT_QUOTES+'UTF-8',避免多字节字符截断漏洞 - textarea 内容要放在标签体内,不是
value属性:<textarea><?php echo htmlspecialchars($_POST['content'] ?? '', ENT_QUOTES, 'UTF-8'); ?></textarea>
复选框/单选按钮的 checked 状态怎么回显
复选框没有 value 属性能“回填”,它靠是否存在 checked 属性来控制状态。所以逻辑是:判断当前选项的 value 是否在已提交的数组里。
比如用户提交了 hobbies[]=reading&hobbies[]=coding:
<input type="checkbox" name="hobbies[]" value="reading" echo in_array :>> 阅读<br><input type="checkbox" name="hobbies[]" value="coding" echo in_array :>> 编程<br>
注意:
-
$_POST['hobbies']可能不存在,所以要用?? []提供默认空数组 - 不要用
isset($_POST['hobbies']) && in_array(...),因为未勾选任何复选框时,$_POST['hobbies']根本不会出现在请求中 - 单选按钮(
type="radio")逻辑完全一样,只是name不带[]
下拉菜单(<select></select>)的 selected 怎么设
跟复选框类似,但要遍历 <option></option>,对每个 value 判断是否等于已提交值:
<select name="category"><option value="">-- 请选择 --</option> <option value="news" echo :>> 新闻</option> <option value="tech" echo :>> 技术</option></select>
常见陷阱:
- 别忘了空值(如 placeholder 选项)也要参与比较,否则首次加载或清空后无法回显“未选择”状态
- 如果后端存的是数字 ID,而 option 的 value 是字符串(如
"1"),用===会失败,此时改用==或统一转类型 - 多选下拉(
multiple)处理方式等同于复选框,用in_array()
文件上传控件(type="file")不能回显
出于安全限制,浏览器禁止 JS 或服务端设置 <input type="file"> 的 value,所以它永远无法回显。这是故意设计,不是你漏写了什么。
实际应对策略只有两个:
- 验证失败时,不刷新页面,改用 AJAX 提交(此时整个表单 DOM 保留,文件 input 自然还在)
- 若必须走传统 POST,就接受这个事实:文件域每次都要重选,其他文本字段才需要回显
别试图用 JS 给 file input 赋值,现代浏览器会直接忽略,还可能抛错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











