表单回显需手动实现:input/value用??和htmlspecialchars()防XSS;textarea内容写标签体内;checkbox/radio用??[]防未选报错;select需逐个比对option加selected;编辑页应优先用数据库数据而非$_POST。

回显不是“自动发生”的事,PHP、JavaScript 或浏览器本身都不会替你把数据塞进表单里——你必须显式写代码把值读出来、转义后填进去,否则用户一提交就看到空白框。
text/number/email 等 input 的 value 属性必须手动赋值
常见错误是只写了 <input name="title">,却没给 value 属性塞值。PHP 中最稳妥的写法是:
value="<?php echo htmlspecialchars($_POST['title'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"-
?? ''防止未提交时触发Undefined index警告 -
htmlspecialchars()必须加,否则用户输入<script>alert(1)</script>会直接执行 - 不要用
isset($_POST['title']) ? $_POST['title'] : '',多一次判断没必要,??更简洁安全
textarea 内容不能放 value 里,得写在标签体内
很多人照搬 input 的写法,写成 <textarea value="..."></textarea>,这是无效的——textarea 的内容属于标签体(body),不是属性。
- 正确写法:
<textarea name="content"><?php echo htmlspecialchars($_POST['content'] ?? '', ENT_QUOTES, 'UTF-8'); ?></textarea> - 注意:这里没有
value属性,所有内容都在开始和结束标签之间 - 如果用了 Vue 或 React,要确保不和框架的 v-model / value 绑定冲突
checkbox 和 radio 的 checked 状态靠属性存在与否控制
它们没有 value="<?php ... ?>" 这种回填方式,是否勾选完全取决于有没有 checked 属性。
立即学习“前端免费学习笔记(深入)”;
- 对于单选
radio:<input type="radio" name="status" value="active" <?php echo ($_POST['status'] ?? '') === 'active' ? 'checked' : ''; ?> > - 对于多选
checkbox(带[]):<input type="checkbox" name="tags[]" value="php" <?php echo in_array('php', $_POST['tags'] ?? []) ? 'checked' : ''; ?> > - 关键点:
$_POST['tags']可能根本不存在(一个都没选),所以必须用?? []提供默认空数组,否则in_array会报错 - 别用
isset($_POST['tags']) && in_array(...),逻辑冗余且漏掉“全未选”场景
select 下拉框的 selected 要逐个比对 option 的 value
下拉框不会自己“记住”该选哪个,你得遍历每个 <option>,手动加 selected 属性。
- 示例:
<option value="2026"<?php echo ($_POST['year'] ?? '') == '2026' ? ' selected' : ''; ?>>2026</option> - 注意空值处理:
<option value="">-- 请选择 --</option>对应$_POST['year'] ?? ''刚好匹配 - 如果后端返回的是整型(如
2026),而 HTML 中value="2026"是字符串,用==比较即可;若严格要求类型一致,改用===并确保两边都是字符串
最容易被忽略的是:表单初始加载时,如果页面是编辑态(比如 URL 带了 ?id=123),那回显逻辑应该基于数据库查出的数据(如 $row['email']),而不是 $_POST——后者只在提交失败后才有意义。混用这两者会导致编辑页第一次打开就空白。



















