You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用htmlspecialchars处理POST请求体时触发http_build_query类型错误

错误原因分析

你遇到的http_build_query(): Argument #1 ($data) must be of type array, string given错误,核心原因有两个:

  1. 误写超全局变量:应该用$_POST而非$POST,直接写$POST会被视为未定义变量(宽松模式下会被当作空字符串)。
  2. 错误地对整个$_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:49