如何在CURLOPT_POSTFIELDS中包含数组数据?

时间:2011-02-24 12:24:17

标签: php arrays forms curl

我基本上使用PHP处理HTML表单,然后将其发送到其他地方进行存储和处理。但是我通过curl发送数组列表时遇到了麻烦。我需要这样做,当它到达接收服务器时,就好像它直接来自输入表单。

如果我序列化数组,在使用该函数时没有收到任何错误,但是这使得服务器无法读取它们,所以他们需要保留post格式,就像它们来自HTML表单一样。

我正在使用Kohana,但Curl的原则仍然相同,这是我的代码:

            $path = "/some/process/path";
            $store = "http://www.website.com";

            $url = $store . $path;

            $screenshots = array();
            $screenshots[0] = 'image1.jpg';
            $screenshots[1] = 'image2.jpg';
            $screenshots[2] = 'image3.jpg';

            $videoLinks = array();
            $videoLinks[0] = 'video1.wmv';
            $videoLinks[1] = 'video2.wmv';

            $params = array(
                'id' => '12',
                'field1' => 'field1text',
                'field2' => 'field2text',
                'field3' => 'field3text',
                'screenshots' => $screenshots,
                'videoLinks' => $videoLinks,
            );

            $options = array(
                CURLOPT_HTTPHEADER => array("Accept: application/json"),
                CURLOPT_TIMEOUT => 30,
                CURLOPT_POST => TRUE,
                CURLOPT_POSTFIELDS => $params,
            );

            $data = Remote::get($url, $options);
            $json = json_decode($data);

干杯。

3 个答案:

答案 0 :(得分:51)

CURLOPT_POSTFIELDS => http_build_query($params),

http://php.net/manual/en/function.http-build-query.php

答案 1 :(得分:6)

我只想分享http_build_query()

的替代方案

您可以通过单独提供每个子数组项来包含CURLOPT_POSTFIELDS的数组输入。

而不是......

$videoLinks = array();
$videoLinks[0] = 'video1.wmv';
$videoLinks[1] = 'video2.wmv';

$params = array(
    ...
    'videoLinks' => $videoLinks;
    ...
);

......这样做......

$params = array(
    ...
    'videoLinks[0]' => 'video1.wmv';
    'videoLinks[1]' => 'video2.wmv';
    ...
);

答案 2 :(得分:1)

我是cURL及其PHP版本的新手,但据我所知你可以在你的选项中做数组就好了,只是不要忘记如果你发送一个field =>值的数组然后您必须将Content-Type标头设置为multipart / form-data才能正确解释。话虽这么说,你的params数组格式错误。您的最终数组值后面有额外的逗号。这可能是什么让它变得笨拙。