应使用 isset() 或 filter_input() 安全获取 get 参数:isset() 判断键存在且非 null,filter_input() 内置过滤验证;禁用 notice 或用 @ 抑制错误是不良实践,php 8+ 已将未定义键升级为 warning。

直接访问 $_GET 中不存在的键会触发 Notice: Undefined index,这不是致命错误,但暴露了未做参数存在性判断的问题。
用 isset() 或 array_key_exists() 判断参数是否存在
最常用也最安全的方式是先检查键是否存在,再取值。两者有细微差别:
-
isset($_GET['id'])返回false如果键不存在,或值为null(注意:空字符串、0、false都算“存在”) -
array_key_exists('id', $_GET)只看键是否存在,不管值是不是null
日常处理 GET 参数,推荐用 isset(),简洁且符合多数场景需求:
$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
用 filter_input() 更安全地获取并过滤参数
比手动判断更进一步,filter_input() 内置校验和过滤能力,还能自动处理类型转换,避免手写类型强转出错:
立即学习“PHP免费学习笔记(深入)”;
- 获取整数:
filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT) - 获取字符串并去除 HTML 标签:
filter_input(INPUT_GET, 'q', FILTER_SANITIZE_SPECIAL_CHARS) - 验证邮箱格式:
filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL)
返回 false 表示验证失败或参数不存在,不会报 Undefined index:
$page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT) ?: 1;
禁用 Notice 不是解决办法
有人用 @$_GET['x'] 或临时关闭错误报告(如 error_reporting(E_ALL & ~E_NOTICE))来掩盖问题,这只会让潜在逻辑漏洞更难发现:
-
@运算符会抑制所有错误,包括真正该关注的警告 - 线上环境关闭
Notice可能掩盖参数名拼写错误、前端漏传等实际缺陷 - PHP 8+ 对未定义数组键已升级为
Warning级别,@仍会生效但更不推荐
真正需要的是明确告诉 PHP:“这个参数可能没有,我已准备好兜底逻辑”。
GET 参数本质是不可信输入,是否定义、是否合法、是否被篡改都得自己确认。跳过判断只图代码短,后面调试时花的时间远多于多敲几个字符。










