Отправка массива с помощью curl_setopt - PullRequest
18 голосов
/ 29 января 2010

Прикрепленный код возвращает «Примечание: преобразование массива в строку в ...». Просто мой массив обрабатывается на удаленном сервере как строка, содержащая слово «Массив». с остальными переменными все в порядке.

Как я могу передать свой массив $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 ]

29 голосов
/ 29 января 2010

Использование 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 superglobal

15 голосов
/ 29 января 2010

Лучший способ выполнить то, что вам нужно, это использовать http_build_query().

1 голос
/ 24 июня 2013

Из-за особенностей протокола 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
1 голос
/ 01 мая 2013

С http://www.php.net/manual/en/function.curl-setopt.php описание CURLOPT_POSTFIELDS

Полные данные для отправки в HTTP-операции «POST». Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь. Тип файла может быть явно указано после имени файла с типом в формат '; тип = mimetype'. Этот параметр может быть передан как строка в кодировке urlen, например, 'para1 = val1 & para2 = val2 & ...' или массив с имя поля в качестве ключа и данные поля в качестве значения. Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, значение должно быть массивом, если файлы передаются этой опции с префиксом @.

0 голосов
/ 29 января 2010

Если $ anarray - это массив, как я подозреваю, это не должно быть. Превратите это в строку, объединяя или любым другим подходящим методом.

Редактировать: см. Ответ Эрика Бутера.

...