使用CURLOPT_POSTFIELDS时进行数组2字符串转换

时间:2016-01-25 19:31:32

标签: php arrays curl libcurl notice

我有以下代码:

// $postfields = array();
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);

我的$postfields变量是一个参数数组。我有一个通知,有数组到字符串转换。它起作用。

我可以使用http_build_query()函数来取消通知,但是我使用@path_to_file来包含帖子文件。和http_build_query()中断文件包含。

我想知道是否有更多“正确”的方法来做到这一点。没有发出通知。

3 个答案:

答案 0 :(得分:7)

$postfields数组的某些值本身是什么?这很可能是导致通知的原因。 curl_setops期望其第三个参数是一个数组,其键和值是字符串,如PHP's manual page for the function中所述,尽管可能不是很清楚:

  

此参数可以作为urlencoded字符串传递,例如' para1 = val1& para2 = val2& ...'或者作为一个数组,字段名称为键,字段数据为值。

在这句话中,关键点是para1 / 2和val1 / 2是字符串,如果需要,你可以将它们作为一个数组提供,其中键是para1和para2,值是val1和val2。

两种消除通知的方法

第一个是使用http_build_query()并将@filepath的使用替换为CURLFile objects。不幸的是,只有在您使用PHP 5.5或更高版本时才可以这样做。手册的页面非常简洁example of use

如果您不能选择使用CURLFiles,那么第二方式是json_encode() $postfields数组的值,这些数组本身就是数组。这并不优雅,它要求您在另一侧解码JSON。

答案 1 :(得分:5)

如果你想发送多维数组,那么j11e的答案将无法运行

试试这个递归函数。

https://gist.github.com/yisraeldov/ec29d520062575c204be7ab71d3ecd2f

<?php
function build_post_fields( $data,$existingKeys='',&$returnArray=[]){
    if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
        $returnArray[$existingKeys]=$data;
        return $returnArray;
    }
    else{
        foreach ($data as $key => $item) {
            build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
        }
        return $returnArray;
    }
}

你可以像这样使用它。

curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));

答案 2 :(得分:3)

使用Laravel对我有用的一件事是在请求标头中使用标签“ Content-Type:application / json”,然后发送编码如下的数据json:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

在接收请求中参数的函数中,我不需要使用json解码函数,就像

一样,我可以访问参数

$request->something