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

PHP中如何在POST请求中添加重复参数?

问题描述

尝试用PHP发送带有重复参数的POST请求,当前代码仅能发送szkbuChkbx的最后一个元素,相关代码如下:

请求参数构造代码:

$searchData = array(
    'ListShow' => 'ListShow',
    'dspSsuPd' => '200', //rows per page
    // 'szkbuChkbx' => json_encode($arrsearhchbx),
    'szkbuChkbx[]' => array('011',
    '012',
    '111',
    '112'),
    'lstDspPg' => $n //pages
);
$searchData = http_build_query($searchData);

//search with cookie and data to get result
if ($cookie == '') {
    echo 'cookie is empty';
} else {
    $searchResult = postRequest($searchActionURL, $cookie, $searchData);
}

cURL请求函数:

function postRequest($url, $cookie, $params)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache",
            "content-type: application/x-www-form-urlencoded",
            "postman-token: 2c3803ce-d9e9-d7b5-4ba6-cb0313cd1e22",
            "user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
            "Cookie: " . $cookie,
        ),
    ));
    curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
        return false;
    } else {
        return $response;
    }
} 

解决方法

核心问题是不要提前用http_build_query处理参数数组,直接将数组传递给CURLOPT_POSTFIELDS,cURL会自动正确编码重复参数。

修改步骤:

  1. 移除http_build_query调用,保留原始参数数组:
$searchData = array(
    'ListShow' => 'ListShow',
    'dspSsuPd' => '200',
    'szkbuChkbx' => array('011', '012', '111', '112'), // 键名无需加[],cURL会自动处理
    'lstDspPg' => $n
);
// 删掉 $searchData = http_build_query($searchData); 这一行

如果后端明确要求参数名带[](如szkbuChkbx[]),则保持键名为szkbuChkbx[]即可,cURL会生成szkbuChkbx[]=011&szkbuChkbx[]=012...的格式。

  1. 优化cURL请求配置:
    将CURLOPT_CUSTOMREQUEST => "POST"替换为CURLOPT_POST => true,这是POST请求的标准配置,避免忽略cURL的自动编码逻辑;同时可以移除手动设置的content-type头(传递数组时cURL会自动设置正确的application/x-www-form-urlencoded头):
function postRequest($url, $cookie, $params)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_POST => true, // 替换为标准POST配置
        CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache",
            "user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
            "Cookie: " . $cookie,
        ),
    ));
    curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
        return false;
    } else {
        return $response;
    }
} 

原理说明

当传递数组给CURLOPT_POSTFIELDS时,cURL会自动将其编码为符合application/x-www-form-urlencoded规范的格式,重复参数会以key=value1&key=value2(或key[]=value1&key[]=value2)的形式发送,确保所有元素都能被后端接收。而提前用http_build_query处理数组时,若键名带[],虽然也能生成正确格式,但直接传递数组更简洁可靠,避免手动编码可能出现的问题。

内容的提问来源于stack exchange,提问作者Tran Minh Quan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:14:54