$_get 默认只保留同名参数的最后一个值,需用数组语法(如tag[]=php)获取全部;空值、0、false均作为字符串存在,需用isset()或===严格判断;中文参数须确保utf-8编码链一致,避免手动二次urldecode。

PHP 直接通过 $_GET 就能拿到全部 URL 参数,不需要额外“接收”或“解析”——但参数名重复、空值、编码异常时行为容易出错。
为什么 $_GET 有时拿不到多个同名参数?
浏览器和 PHP 默认只保留最后一个同名参数(如 ?tag=php&tag=web&tag=api → $_GET['tag'] === 'api')。这不是 bug,是 PHP 的默认行为。
- 若需保留全部,必须用数组语法传参:
?tag[]=php&tag[]=web&tag[]=api,此时$_GET['tag']是数组['php','web','api'] - 手动拼接 URL 时别漏掉
[],否则后端永远只看到最后一个 - 前端 JS 构造 URL 时可用
URLSearchParams确保格式正确
$_GET 中的空字符串、0、false 怎么区分?
URL 参数全是字符串,?id=&page=0&active=false 进来后:$_GET['id'] === ''、$_GET['page'] === '0'、$_GET['active'] === 'false'。PHP 不做类型转换。
- 别直接用
empty($_GET['id'])判空——''、'0'、null都会返回 true - 严格判断是否存在:用
isset($_GET['id']) - 判断是否为空字符串:用
$_GET['id'] === '' - 需要转整型?先
filter_var($_GET['page'], FILTER_VALIDATE_INT),别直接(int)
中文或特殊字符参数乱码或丢失?
根本原因是 URL 编码不一致:urlencode() 和 urldecode() 在 PHP 内部自动调用,但前提是前端传入的是合法 UTF-8 编码。
立即学习“PHP免费学习笔记(深入)”;
- 确保 HTML 页面声明了
<meta charset="UTF-8"> - 前端 JS 用
encodeURIComponent('中文'),不是encodeURI(后者不编码/ ? & =) - PHP 中不要手动
urldecode($_GET['q'])——$_GET已解码,再解一次会出错 - 如果参数含
+,注意它在 URL 中代表空格,不是字面加号;真正想传+得用%2B
最常被忽略的是参数命名冲突和编码链断裂:前端用 GBK 编码发请求,后端 UTF-8 解析,或者 nginx 配置了 charset GBK 却没同步到 PHP —— 这类问题不会报错,只会静默丢数据或显示 。










