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会自动正确编码重复参数。
修改步骤:
- 移除
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...的格式。
- 优化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
相关产品推荐
相关产品推荐

