PHP 8.0+ 中 parse_str() 的第二个参数 $result 是强制的,否则抛出 ValueError;PHP 7.2–7.4 不传会触发 E_DEPRECATED 警告。函数自动 URL 解码,重复解码会导致乱码;键名中点号和空格被转为下划线;受 max_input_vars 限制,超限字段静默丢弃。

PHP 8.0+ 必须传第二个参数,否则报错;PHP 7.2+ 不传会触发 E_DEPRECATED 警告 —— 别再用 parse_str($str) 了。
必须传 $result 数组参数,否则 PHP 8 直接报致命错误
从 PHP 8.0.0 开始,parse_str() 的第二个参数 $result 是强制的。漏掉它会抛出 Fatal error: Uncaught ValueError: parse_str(): Argument #2 ($result) is required。
- PHP 7.2–7.4:不传
$result会触发E_DEPRECATED警告,但还能跑 - PHP 8.0+:不传就挂,没商量
- 即使你只是临时调试,也得写成
parse_str($str, $dummy),不能省
parse_str() 会自动 URL 解码,别自己套 urldecode()
函数内部已按 urldecode() 规则处理所有 %xx 和 +(空格),重复解码反而会导致乱码,比如把 %20 变成 后再解一次,就变成 。
- 正确:
parse_str('name=John%20Doe&city=New%2BYork', $out)→$out['name'] === 'John Doe' - 错误:
parse_str(urldecode($str), $out)→ 可能损坏中文、emoji 或特殊符号 - 注意:
+在查询字符串中代表空格,不是字面加号;%2B才是真正的+
键名含点号或空格会被转成下划线,数组语法不受影响
parse_str() 会把 key 中的 . 和空格统一替换成 _,这是为了兼容变量命名规则 —— 即使你用了 $result 数组,这个转换照常发生。
立即学习“PHP免费学习笔记(深入)”;
-
parse_str('user.name=Tom&first name=Jerry', $out)→ 得到$out['user_name']和$out['first_name'] - 但数组语法如
users[]=a&users[]=b或data[0][id]=1不受影响,仍生成正确嵌套结构 - 如果原始 key 必须保留点号(比如对接某些 API),别用
parse_str(),改用explode('&', $str)+ 手动urldecode()+ 正则提取
受 max_input_vars 限制,超限字段静默丢弃
该函数实际走的是 PHP 内部的输入变量解析路径,因此受 php.ini 中 max_input_vars 控制(默认 1000)。超出部分不会报错,只会被直接忽略。
- 现象:
parse_str($longStr, $out)后发现最后几十个参数没进数组,且无任何 warning - 排查方式:
echo ini_get('max_input_vars');,再数一下原始字符串里&的数量 +1 - 解决:在 php.ini 或运行时调大限制:
ini_set('max_input_vars', '5000');(需有权限)
最易被忽略的一点:它不校验输入格式合法性 —— 如果字符串不是标准 key=value 对(比如缺 =、开头多 &、混入换行),结果可能为空或部分失效,且不报错。上线前务必用真实数据做边界测试。



















