PHP表单处理核心是接收、验证、安全输出三步;优先用$_POST防敏感信息泄露,$_GET仅适用于搜索等场景;须用??或isset()避免“Undefined index”错误;所有用户输入输出前必须用htmlspecialchars()防XSS。

直接上手写一个能跑通、不报错、还能防基础攻击的表单,比看十页理论更有效。PHP表单处理的核心就三件事:接收数据、验证数据、安全输出——其余都是围绕这三点展开的枝节。
$_POST 和 $_GET 到底该用哪个?
绝大多数情况用 $_POST,不是因为“高级”,而是因为现实约束:
- 密码、邮箱、手机号这类字段一旦走
$_GET,会完整暴露在 URL 里,浏览器历史、服务器日志、代理缓存都可能留下痕迹 -
$_POST没有 URL 长度限制,上传文件、长文本留言必须靠它 - 表单
method="post"时,$_GET里根本收不到数据(除非你手动拼 query string) - 例外场景:搜索框、分页链接、分享用的带参跳转,用
$_GET更合适,也方便用户复制链接
为什么一提交就报 “Undefined index” 错误?
这是新手最常卡住的地方:直接写 $_POST['username'],但用户没填或页面刚打开时根本没提交,这个 key 就不存在。
正确做法是始终做存在性检查和默认值兜底:
立即学习“PHP免费学习笔记(深入)”;
- 用空合并运算符:
$username = $_POST['username'] ?? ''; - 或搭配
trim()去空格:$email = trim($_POST['email'] ?? ''); - 千万别写
if ($_POST['submit'])—— 如果按钮 name 是submit,但用户按回车提交,这个 key 可能根本不存在 - 推荐用
$_SERVER['REQUEST_METHOD'] === 'POST'判断是否为真实提交
htmlspecialchars() 不是可选项,是必选项
只要把用户输入原样 echo 到 HTML 页面里,就必须过一遍 htmlspecialchars(),否则 XSS 攻击就成立了。
常见被忽略的输出点:
- 表单重填时把旧值回显:
<input value="<?php echo htmlspecialchars($username); ?>"> - 错误提示里拼接用户输入:
echo '邮箱格式错误:' . htmlspecialchars($email); - 哪怕只是调试用的
var_dump(),如果输出到浏览器 HTML 环境里,也可能触发脚本执行 - 注意:
htmlspecialchars()默认只处理双引号,如需兼容单引号,加参数ENT_QUOTES
验证逻辑别全堆在显示层
前端 required 或 JS 校验只是体验优化,后端 PHP 必须独立完成全部验证——因为前端可以被绕过。
一个最小可用的验证结构应包含:
- 非空检查:
empty($username) - 长度限制:
strlen($username) 20 - 格式过滤:
filter_var($email, FILTER_VALIDATE_EMAIL) - 特殊字符清理(如用户名不许含 HTML 标签):
strip_tags($username) - 所有验证失败,应收集错误信息数组,统一返回给前端,而不是中途
die()或跳转
复杂业务中容易被忽略的是“验证顺序”:比如先检查邮箱格式,再检查是否已注册——后者依赖数据库查询,耗时高,应放在最后;而空值、长度这些低成本检查必须前置,避免无谓开销。



















