我必须通过Curl将包含括号的变量名称的请求发布到远程网页。
远程表单包含括号中的变量,例如:
<input name="test[firstname]">
<input name="test[lastname]">
所以,我建立了我的Curl请求:
function httpPost($url,$params)
{
$postData = '';
foreach($params as $k => $v)
{
$postData .= $k . '='.$v.'&';
}
$postData = rtrim($postData, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_POST, count($postData));
curl_setopt($ch,CURLOPT_POSTFIELDS, $postData);
$output = curl_exec($ch);
if($output === false)
{
return 'Curl error: ' . curl_error($ch);
}
else
{
return $output;
}
curl_close($ch);
}
$params = array(
"test[firstname]" => "Frank",
"test[lastname]" => "Tomaso"
);
var_dump($params);
// array(2) { ["test[firstname]"]=> string(5) "Frank" ["test[lastname]"]=> string(6) "Tomaso" }
echo httpPost("http://www.mywebsite.tld/search/",$params);
脚本不会返回任何错误,但屏幕上没有任何内容($ output)。如果我删除$ params内容,它会输出页面但没有任何结果。所以我认为括号中的变量名有问题。你觉得怎么样?
答案 0 :(得分:0)
我认为您可以通过
尝试代替您的阵列$params = array(
"test" => ["firstname=>"Frank", "lastname"=>"Tomaso"],
);
然后当您发送到curl时,您可以尝试
$data_param = array('data'=>json_encode($params))
curl_setopt($ch,CURLOPT_POSTFIELDS, $data_param);
在你的网址中,你可以使用json_decode来解码数据。
答案 1 :(得分:0)
foreach($params as $k => $v)
{
$postData .= $k . '='.$v.'&';
}
这段代码不正确,因为它没有对$k
和$v
进行网址编码。
但是您不需要迭代$params
,对密钥和值进行编码并手动构造查询字符串。 PHP函数http_build_query()
为您完成了所有艰苦的工作:
$postData = http_build_query($params);
你甚至可以:
$params = array(
'user' => array(
'firstname' => 'Frank',
'lastname' => 'Tomaso',
),
);
和http_build_query($params)
仍会为您生成正确的查询字符串。
但是,如果它仍然无法正常工作,那么您应该仔细阅读远程表单并发送表单中所有字段的值,包括提交按钮。