PHP出现parse_str()参数不足的ArgumentCountError报错 如何适配最新版本?
错误原因
Fatal error: Uncaught ArgumentCountError: parse_str() expects exactly 2 arguments, 1 given.
这个报错是因为从PHP 8.0版本开始,parse_str() 函数完全移除了仅传1个参数的用法,必须传入第二个参数用来接收解析后的查询字符串结果。更早的PHP 7.2+版本就已经对单参数用法抛出废弃警告了。
原来单参数调用时,parse_str() 会自动把查询字符串的键值对注册成全局变量,这种写法本身就有严重的安全隐患,早已不推荐使用。
代码修改方案
只需要调整parse_str()的调用方式,主动接收解析结果,再从结果中取对应的参数即可,修改后的完整代码如下:
// 第二个参数传入数组,接收解析后的查询参数 parse_str($_SERVER['QUERY_STRING'], $queryParams); // 从解析结果中取参数,同时处理参数不存在的情况 $m = $queryParams['m'] ?? ''; $y = $queryParams['y'] ?? ''; if ($m == ""){ $dateComponents = getdate(); $month = $dateComponents['mon']; $year = $dateComponents['year']; } else { $month = $m; $year = $y; } echo build_previousMonth($month, $year, $monthString); // ... etc
额外说明
- 代码中使用的
??是PHP 7.0+支持的null合并运算符,当对应的参数不存在时会自动赋值为右侧的默认值,避免未定义变量的警告 - 调整后的写法也杜绝了原单参数
parse_str()自动注册全局变量带来的变量覆盖安全风险
内容的提问来源于stack exchange,提问作者YorkshireTim
相关产品推荐
相关产品推荐

