PHP中GET参数不会自动传递,需手动处理:用http_build_query($_GET)安全拼接URL、过滤敏感参数、隐藏域携带至POST、注意输出控制与XSS防护。

PHP 中 GET 参数默认不会自动传递到下一页,必须显式处理——要么拼接到新 URL,要么用 $_GET 重新构造,否则点击链接或跳转后参数就丢了。
直接在链接中手动拼接 $_GET 参数
这是最常用、最可控的方式,适合跳转逻辑简单、参数不多的场景。关键点是:不能直接写死参数名,要遍历 $_GET 并用 http_build_query() 编码,避免特殊字符(如空格、中文、& 符号)导致 URL 截断或解析错误。
- 用
http_build_query($_GET)生成安全的查询字符串,它会自动urlencode所有值 - 如果只想传部分参数,先用
array_intersect_key($_GET, array_flip(['id', 'sort']))过滤,再拼接 - 注意不要把敏感参数(如
token、admin=1)无意识透传出去 - 示例:
下一页
用 header('Location: ...') 跳转时保留 GET 参数
服务端重定向时,$_GET 不会自动带过去,必须手动构造目标 URL。常见错误是只写 header('Location: next.php'),结果所有参数消失。
- 拼接方式和上一条一致:
header('Location: next.php?' . http_build_query($_GET)); - 务必在
header()前确保没有输出(包括空格、BOM、echo),否则报Cannot modify header information - 如果当前页面已输出部分内容,只能改用前端跳转(如
echo ''),但不推荐
POST 表单提交时想“捎带” GET 参数怎么办
表单默认只提交 input 字段,原始 URL 中的 GET 参数不会进 $_POST。想让它们一起提交,得把 GET 参数转成隐藏域。
立即学习“PHP免费学习笔记(深入)”;
- 在
内循环输出:$v): ?>
- 注意对
$k和$v做htmlspecialchars(),防止 XSS(尤其当 GET 值来自用户输入时) - 如果参数值本身含 HTML 实体(如
&),需提前html_entity_decode()再处理,否则双重编码
跨页传参看着简单,但实际容易栽在编码、过滤、XSS 和重定向时机上。最常被忽略的是:没检查 $_GET 是否为空就直接 http_build_query(),结果 URL 末尾多出一个问号;或者忘记过滤掉不需要透传的调试参数(比如 debug=1)。这些细节不处理,上线后可能引发安全或体验问题。











