最安全获取get参数id的方式是filter_input(input_get, 'id', filter_sanitize_number_int);$_get仅适用于当前请求,手动解析url需用parse_url()和parse_str()处理外部url或非标准编码。

直接用 $_GET 数组取值就行,不需要额外解析 URL —— PHP 已在请求开始时自动把查询参数解析进这个超全局变量里。
怎么安全获取一个叫 id 的 GET 参数
最常用也最直接的方式就是:$_GET['id']。但注意它可能不存在、为空或不是预期类型:
- 用
isset($_GET['id'])判断参数是否存在(避免未定义索引警告) - 用
!empty($_GET['id'])判断是否非空(但会把"0"当作空,慎用) - 更稳妥的做法是:
filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT),能过滤掉非数字字符,适合 ID 类参数 - 如果需要默认值,别手写三元:
$_GET['id'] ?? 1(PHP 7+)或filter_input(INPUT_GET, 'id', FILTER_DEFAULT, ['options' => ['default' => 1]])
$_GET 和 parse_url() + parse_str() 的区别在哪
绝大多数场景下,$_GET 完全够用;只有两种情况才需手动解析 URL:
- 你要从**别的 URL 字符串**(比如日志里存的、数据库查出来的)中提取参数,而不是当前请求的 URL —— 这时得用
parse_url($url, PHP_URL_QUERY)拿到查询字符串,再用parse_str()解析 - 当前请求用了非标准编码(如加了空格没转义成
+或%20),导致$_GET解析失败(极少见,通常说明客户端有问题) -
$_GET是只读的、已解码的、已 urldecode 处理过的;而parse_str()默认也做 urldecode,但你可以传引用变量控制行为
为什么有时 $_GET['q'] 取不到值,但 URL 明明有 ?q=abc
常见原因不是 PHP 问题,而是环境或配置干扰:
立即学习“PHP免费学习笔记(深入)”;
- Web 服务器重写了 URL(比如 Nginx 的
try_files或 Apache 的RewriteRule),把查询参数丢掉了 —— 检查重写规则末尾有没有加?或[QSA]标志 - PHP 配置里
variables_order没包含G(即禁用了 GET),但这种情况极少,且会导致整个$_GET为空 - 参数名含特殊字符(如点
.、中括号[]),PHP 会自动转换:user.name→user_name,arr[0]→arr(数组形式仍可用,但单个键要按实际结构访问) - 浏览器或代理对 URL 做了二次编码,比如
%2520(即%20被又 encode 了一次),此时$_GET只解一层,需手动urldecode()
真正要注意的是:别假设 $_GET 里的值是可信的,任何输出前该转义就转义,入库前该过滤就过滤 —— 获取容易,用得稳才是关键。











