2016-01-25 2 views
0

я следующий код:Массив 2 строки преобразования при использовании CURLOPT_POSTFIELDS

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

Моя $postfields переменная является массивом параметров. И у меня есть уведомление, что есть массив для преобразования строк. Это работает.

Я могу использовать функцию http_build_query(), чтобы аннулировать уведомление, однако я использую @path_to_file для включения файлов сообщений. и http_build_query() файл разрывов.

Мне интересно, есть ли более «правильный» способ сделать это. Без создания уведомления.

ответ

4

Имеются ли значения в массивах $postfields? Скорее всего, это вызывает уведомление. curl_setops ожидает, что третий параметр представляет собой массив, ключи и значения строк, как указано в PHP's manual page for the function, хотя это может быть не очень понятно:

Этот параметр может быть либо принят в качестве urlencoded строки, как «para1 = val1 & para2 = val2 & ... 'или как массив с именем поля в качестве ключа и данных поля в качестве значения.

В этой цитате, ключевым моментом является то, что para1/2 и знач1/2 являются строками, и если вы хотите, вы можете предоставить их как массив, где ключи para1 и para2, а значения знач1 и val2 ,

Есть два способа устранить уведомления.

The первый является использование http_build_query() и заменить использование @filepath на CURLFile objects. Это возможно, только если вы используете PHP 5.5 или выше, к сожалению. На странице руководства есть довольно четкие и простые example of use.

При использовании CURLFiles не вариант для вас, то второго путь к json_encode() значениям вашего $postfields массива, которые сами массивы. Это не изящно, и для этого требуется декодировать JSON с другой стороны. Ответ

+0

Действительно, 3 значения этого массива сами являются массивами ... Я не использую их, поэтому они, вероятно, не экспортируются должным образом. Не думал, что это могут быть внутренние массивы. – Grzegorz

+0

с использованием 'http_build_query' с' CURLFiles' не работает. 'CURLFiles' преобразуется в массивы и просто встречается как регулярные данные' $ _POST'. –

2

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)); 
Смежные вопросы