PHP出现Undefined array key报错 涉及$_GET/$_POST变量该如何解决?
问题原因
- 你当前XAMPP内置的PHP版本比学长开发项目时使用的版本更高:PHP 7.4及以上版本调整了错误提示等级,直接读取不存在的
$_GET/$_POST数组键会抛出Undefined array key警告,而老版本PHP只会输出不影响程序运行的低级别Notice,学长开发时的环境没有开启这类警告所以没有暴露问题。 - 原代码没有做参数存在性校验,直接读取超全局变量的键值,当你访问对应页面时URL没有携带对应的参数(比如访问
aeadmin.php时没有在URL后缀加?id=xxx)就会触发报错。
解决方法
临时兼容方案(无需修改大量业务代码,快速让项目正常运行)
修改PHP的错误提示等级,屏蔽这类非致命警告:
- 打开XAMPP控制面板,点击Apache模块对应的「Config」按钮,选择
php.ini文件打开 - 搜索
error_reporting配置项,将原有配置值替换为:
error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE
- 保存文件后重启XAMPP的Apache服务即可生效。
规范修复方案(推荐,从根源解决问题)
对所有读取$_GET/$_POST的位置先做存在性判断,或者用PHP7+提供的NULL合并运算符??设置默认值,以下是你提供的报错代码的修改示例:
报错示例1修改前
$result=All("select * from admin where id='1".$_GET["id"]."'");
报错示例1修改后
// 先判断id是否存在,不存在就赋值默认值或者跳转提示 $id = $_GET['id'] ?? 0; if($id == 0){ exit('参数错误,请从正确入口访问页面'); } $result=All("select * from admin where id='".$id."'");
报错示例2表单部分修改前
<form id="form" method="post" action="api.php?do=editu&id=<?=$_GET["id"]?>" enctype="multipart/form-data">
报错示例2表单部分修改后
<form id="form" method="post" action="api.php?do=editu&id=<?=$_GET["id"] ?? 0?>" enctype="multipart/form-data">
额外注意
你贴出的代码直接将$_GET参数拼接进SQL语句,存在严重的SQL注入风险,后续项目运行稳定后建议改成预处理查询,或者对传入参数做类型转义处理,避免被恶意攻击。
内容的提问来源于stack exchange,提问作者RooKie
相关产品推荐
相关产品推荐

