使用htmlspecialchars处理POST请求体时触发http_build_query类型错误
错误原因分析
你遇到的http_build_query(): Argument #1 ($data) must be of type array, string given错误,核心原因有两个:
- 误写超全局变量:应该用
$_POST而非$POST,直接写$POST会被视为未定义变量(宽松模式下会被当作空字符串)。 - 错误地对整个
$_POST数组使用htmlspecialchars:该函数仅接受字符串参数,传入数组时PHP会自动将其转为字符串"Array",导致后续http_build_query收到的是字符串而非预期数组,触发类型错误。
修正方案
需要对POST数据的每个字段单独转义,而非直接处理整个数组。通过遍历$_POST的键值对,逐个应用htmlspecialchars,再将处理后的数组传给http_build_query即可。
修正后的makePostRequest函数如下:
function makePostRequest($baseURL) { $ch = curl_init(); // 初始化空数组存储转义后的POST数据 $clean_post = []; // 遍历$_POST每个元素,逐个转义 foreach ($_POST as $key => $value) { // 指定编码和转义规则,避免编码问题 $clean_post[$key] = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); } $data = http_build_query($clean_post); curl_setopt($ch, CURLOPT_URL, $baseURL); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); // 先获取错误信息再关闭句柄,否则无法捕获错误 $error = curl_error($ch); curl_close($ch); if($error) { echo $error; } else { $json = json_decode($response, true); return print_r($json, true); } }
还要注意两个细节:
- 原代码中
curl_close写在curl_error之前,会导致无法正确获取curl错误信息,修正后调整了顺序。 htmlspecialchars建议明确指定编码(如UTF-8)和转义规则(如ENT_QUOTES),避免因环境编码差异出现转义异常。
额外说明
前端发送的application/x-www-form-urlencoded类型数据,PHP会自动解析到$_POST数组中,无需手动处理原始请求体,直接操作$_POST即可。
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

