直接用$_POST超全局数组获取POST表单数据,需确保method为POST且字段有name属性;无name则无法接收;JSON请求需用php://input+json_decode;filter_input()比裸读更安全,推荐生产环境使用。

PHP 怎么拿到 POST 表单提交的数据
直接用 $_POST 超全局数组,前提是表单 method 是 POST,且字段有 name 属性。没设 name 的输入框,PHP 根本收不到。
常见错误:写了 id="username" 却忘了 name="username",结果 $_POST['username'] 一直报 Undefined index。
-
$_POST只接收application/x-www-form-urlencoded和multipart/form-data编码的 POST 数据(即普通表单和带文件上传的表单) - 如果前端用
fetch或axios发 JSON,后端得用file_get_contents('php://input')+json_decode(),$_POST是空的 - 表单中
这种带[]的写法,PHP 会自动转成数组,$_POST['hobby']就是数组,不是字符串
GET 表单数据为什么用 $_GET 而不是 $_POST
$_GET 对应 URL 查询参数,比如访问 /login.php?user=admin&pass=123,就能用 $_GET['user'] 拿到 admin。它和表单 method="GET" 完全绑定。
注意:$_GET 数据会暴露在 URL、服务器日志、代理缓存里,绝不能传密码、token、敏感 ID。
立即学习“PHP免费学习笔记(深入)”;
- URL 长度有限制(通常几 KB),大数据量别走 GET
-
$_GET和$_POST互不干扰——同一请求里,GET 参数和 POST 数据可以同时存在,各自独立存取 - 若表单用了
method="GET"但后端写了$_POST['xxx'],永远取不到,这是新手最常写的“静默失败”
filter_input() 比直接读 $_POST 更安全吗
是的,而且推荐在生产环境优先用 filter_input() 替代裸读 $_POST 或 $_GET。
它自带过滤和验证,避免忘记转义或类型转换出错。比如想拿一个整数 ID:
filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT)
返回 false 就说明不是合法整数,比 (int)$_POST['id'] 强行转更可靠——后者可能把 "123abc" 变成 123,而 filter_input 会拒绝。
-
INPUT_POST/INPUT_GET/INPUT_COOKIE必须明确指定来源,不能混用 - 常用过滤器:
FILTER_SANITIZE_EMAIL、FILTER_SANITIZE_NUMBER_FLOAT、FILTER_UNSAFE_RAW(慎用) - 不校验必填项,要自己加
=== false || === null判断是否缺失
为什么 $_REQUEST 不建议用
$_REQUEST 是 $_GET、$_POST、$_COOKIE 的合并体,默认按 request_order 配置决定优先级(通常是 GP C)。它看起来方便,但隐患很大:
- 同名参数时,你根本不知道当前读到的是 GET 还是 POST 里的值,调试困难
- 如果某天加了个同名 Cookie,行为突然改变,线上出问题很难定位
- 很多安全扫描工具会警告使用
$_REQUEST,因为它模糊了输入边界 - PHP 8.0+ 默认
request_order = "GP",已排除C(Cookie),但依然不推荐依赖
真正要统一处理不同来源的逻辑,应该显式判断 $_SERVER['REQUEST_METHOD'] === 'POST' 再选数组,而不是靠 $_REQUEST 碰运气。











