应严格按表单method属性选择$_POST或$_GET:method="post"用$_POST,method="get"用$_GET;禁用$_REQUEST以防参数覆盖;取值须判空过滤,输出须转义;name属性、enctype、submit触发、请求链路完整性是常见失值主因。

直接用 $_POST 或 $_GET,别绕弯子——前提是表单 method 和 PHP 访问方式严格匹配,否则拿不到值或拿错值。
怎么判断该用 $_POST 还是 $_GET
看 HTML 表单的 method 属性:是 post 就用 $_POST,是 get 就用 $_GET。两者不能混用,比如 method="post" 却去读 $_GET['username'],结果一定是空或报 Notice。
-
$_POST对应<form method="post">,数据在请求体里,URL 干净,适合密码、文件上传等场景 -
$_GET对应<form method="get">或带查询参数的 URL(如search.php?q=php),参数明文暴露在地址栏,有长度限制 - 浏览器直接访问 URL 时,只有
$_GET有值;AJAX POST 请求过来时,只有$_POST有值
为什么 $_REQUEST 看起来方便却容易出问题
$_REQUEST 是 $_GET、$_POST、$_COOKIE 的合并数组,默认按 request_order = "GP" 顺序覆盖(GET 覆盖 POST)。这意味着:如果 URL 带了 ?id=123,同时表单 POST 了 id=456,$_REQUEST['id'] 拿到的是 123,不是你预期的 456。
- 它模糊了数据来源,调试时根本分不清值从哪来
- 在登录、权限校验、支付回调等关键逻辑中,可能被恶意构造的 GET 参数覆盖 POST 原始值
- php.ini 中
request_order配置不一致时,行为会变(比如有的环境是"PG",POST 反而优先)
怎么安全地取值,避免未定义索引和 XSS
别直接写 $_POST['email'] —— 一旦字段没提交,PHP 会抛 Notice;更别直接 echo $_POST['email'] —— 容易被注入脚本。必须加判断 + 过滤。
立即学习“PHP免费学习笔记(深入)”;
- 用 null 合并运算符兜底:
$email = $_POST['email'] ?? ''; - 用
filter_input()更可靠:filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL),失败返回false,比手动isset()+filter_var()更原子 - 输出到 HTML 前必须转义:
echo htmlspecialchars($email, ENT_QUOTES, 'UTF-8');,尤其对$_GET来的值更要警惕 - 复选框、多选下拉这类数组型字段,HTML name 得写成
interest[],PHP 才能收到$_POST['interest']为数组,否则会丢值
常见拿不到值的几个硬坑
90% 的“收不到表单数据”问题都卡在这几处,而不是语法写错。
- 表单控件(
<input>、<select>、<textarea>)没写name属性——没有name就不会被提交,$_POST里压根不会出现这个键 - 文件上传表单漏了
enctype="multipart/form-data"—— 导致$_FILES为空,连带$_POST里其他字段也丢失(部分旧版 PHP 行为) - 用了
<button type="button">而不是<input type="submit">或<button type="submit">,表单根本没触发提交 - JavaScript 阻止了默认提交(
event.preventDefault())但没手动发请求,页面静默刷新,PHP 收不到任何 POST
最常被忽略的是:PHP 脚本是否真正在处理这次请求?比如表单 action="handle.php",但你编辑的是 index.php,或者 Apache/Nginx 把 POST 请求重写成了 GET——这种底层链路问题,光看 PHP 代码永远查不到。



















