
PHP怎么拿到URL里的参数
直接用 $_GET,它就是干这个的。URL里问号后面那一串(比如 ?id=123&name=test),PHP 自动解析好塞进这个超全局数组里,不用手动 parse。
常见错误现象:$_GET 为空但 URL 明明带参数;或者取到空字符串、null,其实是参数名拼错了、大小写不一致,或用了中文没编码。
- 确保 URL 中参数已正确 URL 编码(中文/特殊字符必须用
encodeURIComponent()或urlencode()处理) - 键名区分大小写:
?ID=123和?id=123是两个不同键,$_GET['id']取不到前者 - 如果参数值含空格或
+,注意 PHP 会把+当作空格处理(这是 CGI 规范,不是 bug) - 不要依赖
$_GET的顺序——它按 URL 参数出现顺序存,但 PHP 不保证遍历时顺序稳定(尤其 PHP 8+)
$_GET 和 $_REQUEST 有啥区别,该用哪个
$_GET 只读 URL 查询参数;$_REQUEST 默认包含 $_GET、$_POST、$_COOKIE,顺序由 php.ini 中的 variables_order 决定(默认是 "GPC")。
容易踩的坑:用 $_REQUEST['x'] 时,如果同名参数同时出现在 URL 和 Cookie 里,你拿到的可能是 Cookie 值而不是 URL 值,而且没法直观判断来源。
立即学习“PHP免费学习笔记(深入)”;
- 明确知道数据来自 URL?只用
$_GET,干净、可预期 - 想兼容 POST 和 GET?自己显式判断
$_SERVER['REQUEST_METHOD'] === 'GET',别偷懒靠$_REQUEST - 线上环境建议关掉
$_REQUEST(设variables_order = "GPC"保持默认即可,但代码里别主动用它)
怎么安全地取一个可能不存在的 URL 参数
直接访问 $_GET['page'] 会触发 Notice: Undefined index —— 这不是致命错误,但日志里刷屏、暴露逻辑、还可能被用于探测参数结构。
正确做法不是靠 @ 抑制错误,而是用语言原生的安全访问方式:
- PHP 7.0+:用空合并操作符
$_GET['page'] ?? 1 - 兼容老版本:用
isset($_GET['page']) ? $_GET['page'] : 1 - 需要类型转换?别直接强转,先校验:
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1; - 别用
extract($_GET)—— 它会把所有参数变成局部变量,极易覆盖已有变量,是历史遗留高危操作
中文参数乱码或取不到怎么办
本质是编码不一致:浏览器发的是 UTF-8 编码的字符串,但 PHP 脚本文件本身可能是 GBK,或服务器配置默认字符集不是 UTF-8,导致 $_GET 解析出错。
典型表现:?q=测试 在 var_dump($_GET) 里变成乱码或截断成半个字符;或者整个参数键/值消失。
- 确保 PHP 文件保存为 UTF-8 无 BOM 格式(编辑器里看得到)
- 在脚本开头加
header('Content-Type: text/html; charset=utf-8');,影响输出,但不影响$_GET解析 - 真正关键的是 Web 服务器配置:Nginx/Apache 需明确声明接受 UTF-8 编码的请求(Nginx 无需额外配置,Apache 可能需
AddDefaultCharset UTF-8) - 调试时用
rawurldecode()看原始字节:echo bin2hex(rawurldecode($_SERVER['QUERY_STRING']));,确认是不是传输层就坏了
phpinfo() 里的 default_charset 和 mbstring.func_overload 设置。











