PHP表单提交必须先判断$_SERVER['REQUEST_METHOD']==='POST',再用filter_input()过滤输入、业务规则校验、重定向防重复提交,并统一处理错误信息。

PHP 表单提交必须检查 $_SERVER['REQUEST_METHOD']
直接读 $_POST 或 $_GET 是危险的——页面刚打开时(GET 请求)就可能触发空提交逻辑,导致插入空数据或报错。必须先判断请求类型:
-
if ($_SERVER['REQUEST_METHOD'] === 'POST')是最安全的入口判断 - 不要用
isset($_POST['submit'])代替,按钮名可能被省略、被 JavaScript 覆盖、或在多按钮表单中不可靠 - 若表单含文件上传,还需额外检查
$_FILES中的error值,不能只看是否设置了字段
过滤和验证必须分两步:先 filter_input(),再业务规则校验
filter_input() 是 PHP 原生过滤函数,比手动 trim()+htmlspecialchars() 更可靠,且支持类型转换:
- 获取并转为整数:
filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT),失败返回false,不是0 - 获取并清理字符串:
filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS)(注意:不自动 trim,需额外调用) -
邮箱验证用
FILTER_VALIDATE_EMAIL,但仅检查格式,不验证域名是否存在 - 业务规则(如“密码至少8位”“用户名不能含空格”)必须在过滤后单独写逻辑,不能依赖 filter 内置规则
成功处理后必须用 header('Location: ...') 重定向
否则用户刷新页面会重复提交(浏览器重发 POST),尤其在支付、注册等关键操作中极易出问题:
- 重定向前确保没有输出(包括空格、BOM、
echo),否则报Warning: Cannot modify header information - 推荐模式:
if (处理成功) { $_SESSION['msg'] = '注册成功'; header('Location: success.php'); exit; } - 不要在重定向后继续执行数据库写入等操作——PHP 不会自动终止脚本,
exit或die必须显式写上
错误信息不能直接 echo 给用户,要存到数组再统一渲染
把验证失败的提示收集到 $errors = [],而不是遇到一个错就 echo 一句,原因很实际:
立即学习“PHP免费学习笔记(深入)”;
- 避免 HTML 结构混乱(比如错误消息插在表单中间,破坏布局)
- 方便前端控制显示位置(顶部汇总 / 字段旁 inline)
- 防止敏感信息泄露(如数据库字段名、路径)——
$errors['email'] = '邮箱格式不正确',而不是'Failed validating email in users.email column' - 配合
$_POST回显值时,可安全使用htmlspecialchars($user_input)防 XSS,但别对错误消息本身再 htmlspecialchars(已是你自己写的纯文本)
exit 和过滤后的空值判断(比如 filter_input 返回 false,却被当成 0 或空字符串继续处理)。这两处一漏,轻则逻辑错乱,重则数据污染或安全缺口。









