PHP&卷曲:在方括号中发布变量

时间:2016-02-18 15:36:14

标签: php curl

我必须通过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内容,它会输出页面但没有任何结果。所以我认为括号中的变量名有问题。你觉得怎么样?

2 个答案:

答案 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)仍会为您生成正确的查询字符串。

但是,如果它仍然无法正常工作,那么您应该仔细阅读远程表单并发送表单中所有字段的值,包括提交按钮。