使用curl_setopt发布数组

时间:2010-01-28 21:34:03

标签: php curl libcurl

附加的代码返回“注意:数组到字符串转换...”。只是我的数组被作为包含“Array”字符的字符串处理到远程服务器。其余的变量都很好。

如何在没有此问题的情况下传递数组$anarray

<?php

$data = array(
    'anarray' => $anarray,
    'var1' => $var1,
    'var2' => $var2
 );

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "MY_URL");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);

?>

5 个答案:

答案 0 :(得分:27)

使用http_build_query()

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
// The values of variables will be shown but since we don't have them this is what we get

然后,您可以使用$_POST超全局

正常访问它

答案 1 :(得分:15)

实现目标的最佳方法是使用http_build_query()

答案 2 :(得分:1)

来自CURLOPT_POSTFIELDS的http://www.php.net/manual/en/function.curl-setopt.php描述

  

要在HTTP“POST”操作中发布的完整数据。要发布文件,   使用@预先添加文件名并使用完整路径。文件类型可以是   通过跟随文件名中的类型明确指定   format'; type = mimetype'。此参数可以作为a传递   urlencoded字符串,如'para1 = val1&amp; para2 = val2&amp; ...'或作为数组   字段名称为键,字段数据为值。如果value是一个数组,   Content-Type标头将设置为multipart / form-data。截至PHP   5.2.0,如果使用@前缀将文件传递给此选项,则value必须是数组。

答案 3 :(得分:1)

由于HTTP协议的性质以及curl_setopt函数的工作方式,$ anarray不能直接作为数组传递。

以下声明:

  

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

获取一系列POST参数,并且每个参数都必须有一个字符串名称和一个 STRING 值。您正在传递一个数组值,因此PHP处理器被迫使用一些蹩脚的内置算法将其转换为字符串,这会产生前面提到的通知(“数组转换为字符串转换...”)。

因此,为了将该数组($ anarray)正确传递给另一方,您必须自己处理其编码(字符串),以及另一方必须处理其解码(从一个字符串)。

我在这种情况下的做法是JSON。它几乎适用于所有情况。您所要做的就是应用以下技术:

$data=array(
    'anarray'=>json_encode($anarray),
    'var1'=>$var1,
    'var2'=>$var2
    );

然后,在连接的另一端,您将通过以下方式检索原始数组:

$anarray=json_decode($_POST['anarray'],true); // true indicates for associative array rather than an object

答案 4 :(得分:0)

如果$ anarray是一个数组,我怀疑它是,它不应该是。通过连接或任何适当的方法将它变成一个字符串。

编辑:见Eric Butera的回答。