$_GET和$_POST拿不到数据是因为未匹配HTTP请求方法与Content-Type:$_POST仅响应application/x-www-form-urlencoded或multipart/form-data,JSON请求需用php://input解析;$_GET依赖URL查询字符串,且二者均需确认method属性、请求头及无输出干扰session_start()。
和
拿不到数据?不是变量没“定义”,而是你没对上请求上下文——PHP 不会凭空填充它们,只按 HTTP 方法和编码规则填。
为什么
总是空数组?
它只响应两种 Content-Type:
(表单默认)和
(文件上传)。前端若发的是 JSON(
),
必然为空,这是设计使然,不是 bug。
先确认请求方法:
,别在 GET 请求里硬查
检查请求头:
,JSON 或 XML 数据得走
+
表单
属性写错、漏写,或用了
但没设
格式,都会导致后端收不到
为什么每次都是新会话?
不是“可选步骤”,而是会话机制的开关。它失败时通常静默,不报错,只让
始终为空。
必须放在脚本最开头,前面不能有任何输出(包括 UTF-8 BOM、空格、
、HTML 标签)
用
显式判断是否真启动成功,别只靠
检查
是否可写(
+
)
反向代理或负载均衡环境下,需确保 session 存储(如 Redis)一致,且 Cookie 的
设置匹配访问域名
和
到底该用谁?
一个来自客户端请求头(可伪造),一个来自服务器配置(不可篡改),用途完全不同。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
拼接跳转 URL、生成当前页面绝对链接时,用
—— 它反映用户实际访问的地址(比如
)
做白名单校验、API 域名限制、内部服务路由时,用
—— 它由 Nginx/Apache 配置决定,更可信
反向代理下
可能被清空或污染,此时应结合
和
做 fallback
注意:
是字符串
或空,不是布尔值,别写
能不能图省事直接用?
能,但代价是调试困难、安全边界模糊、来源不可控。它把
、
、
全混在一起,同名键会被后者覆盖(默认顺序:
,即 Cookie > GET > POST)。
立即学习
“
PHP免费学习笔记(深入)
”;
登录页如果允许
传跳转地址,又同时接收
,攻击者可能通过 Cookie 注入恶意跳转
排查“参数突然变”问题时,你得翻三处来源,而明确用
就只看表单提交逻辑
框架和现代项目基本弃用它;PHP 8.1+ 已标记为“不鼓励使用”,未来可能移除
真要统一入口,建议封装函数:
,自己控制优先级和过滤
关键点不在“记全9个变量”,而在于理解每个变量的**填充时机、可信边界、失效条件**。比如
为空不只是因为没选文件,还可能是
超限却没报错;
读不到,未必是没设,可能是
或
策略拦截。这些细节不跑一次真实请求+抓包+查日志,光看文档永远摸不准。
$_GET$_POST$_POSTapplication/x-www-form-urlencodedmultipart/form-dataContent-Type: application/json$_POSTvar_dump($_SERVER['REQUEST_METHOD']);$_POSTvar_dump($_SERVER['CONTENT_TYPE'] ?? ''); file_get_contents('php://input')json_decode()methodfetchbody$_SESSIONsession_start()$_SESSIONechosession_status() === PHP_SESSION_ACTIVEisset($_SESSION)session.save_pathini_get('session.save_path')is_writable()domain$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']$_SERVER['HTTP_HOST']https://$_SERVER['HTTP_HOST']/callback$_SERVER['SERVER_NAME']HTTP_HOST$_SERVER['SERVER_ADDR']$_SERVER['SERVER_PORT']$_SERVER['HTTPS']"on"if ($_SERVER['HTTPS'])$_REQUEST$_GET$_POST$_COOKIECGP?next=/admin$_REQUEST['next']$_POST['submit']function input(string $key, string $method = 'post'): ?string { ... }$_FILESupload_max_filesize$_COOKIESecureSameSite