Проводка многомерного массива с PHP и CURL
У меня возникли проблемы с отправкой данных формы через CURL на PHP-скрипт приема, расположенный на другом хосте.
Я получаю ошибку Array to string conversion
в Array to string conversion
Это print_r
массива, который я публикую:
Array ( [name] => Array ( [0] => Jason [1] => Mary [2] => Lucy ) [id] => 12 [status] => local [file] => @/test.txt )
Это строка, в которой происходит ошибка:
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post);
Третий аргумент должен быть массивом, потому что мне нужно, чтобы заголовок Content-Type
был настроен на multipart/form-data
поскольку я отправляю файл через этот же массив, поэтому я не могу преобразовать массив в строку запроса или использовать http_build_query()
,
Также у меня нет доступа к коду на принимающем хосте, поэтому я не могу сериализовать и неэтериализовать массив.
Я предполагаю, что значение ключа имени, являющегося массивом, является причиной этой ошибки, я также предполагаю, что CURLOPT_POSTFIELDS
не поддерживает многомерные массивы. Есть ли какой-либо другой способ этого или я обречен?
Заранее спасибо!
Вам нужно будет построить строку POST вручную, а не передавать весь массив. Затем вы можете переопределить заголовок содержимого автозапуска curl с помощью:
Сериализация / json-ifying будет проще, но, как вы говорите, у вас нет контроля над получающим концом, поэтому вам нужно сделать немного дополнительной работы.
Концепция массива на самом деле не существует, когда дело доходит до HTTP-запросов. PHP (и, вероятно, другие серверные языки) имеет логику, испеченную в том, что может принимать данные запроса, которые похожи на массив (к нему), и объединяет их как массив при
$_GET
,$_POST
и т. Д.Например, когда вы POST массива из формы, элементы формы часто выглядят примерно так:
или даже:
Хотя PHP знает, что делать с этими данными, когда он его получает (т. Е. Строит массив), в HTML и HTTP, у вас есть три несвязанных ввода, которые просто имеют сходные (или то же, хотя это не технически корректный HTML ).
Чтобы сделать обратное для вашего запроса cURL, вам нужно разложить свой массив на строковые представления ключей. Итак, с вашим массивом
name
вы можете сделать что-то вроде:Это приведет к тому, что ваш массив
$post
выглядеть так:И тогда каждый ключ в массиве, который вы публикуете, будет скалярным значением, ожидаемым cURL, и массив будет представлен так, как вам нужно для HTTP.
Самое простое решение:
Ниже приведен пример кода, где это используется в реальной жизни:
https://gist.github.com/gayanhewa/142c48162f72e68a4a23
Когда у вас есть раздел вложенных $ params в приведенном выше примере, он проанализирует его соответствующим образом и подготовит его для публикации через curl.
Я думаю, вам нужно передать параметры в виде строки:
Затем вы можете настроить заголовок вручную через CURLOPT_HTTPHEADER.
Параметр cURL
CURLOPT_POSTFIELDS
будет принимать либо строковый, либо простой массив, но не вложенный массив. Попытка сделать это приведет к генерации ошибкиArray to string conversion
.Однако
http_build_query()
может обрабатывать вложенный массив, поэтому используйте его для преобразования массива$_POST
в строку, а затем отправляйте эту строку. Итак, где у вас есть;используйте это вместо этого;
Прежде всего, я хотел бы поблагодарить Даниэля Вандерслуиса за его проницательный ответ . Основываясь на его введении, я придумал это, чтобы исправить проблему из первоначального вопроса:
Использование должно выглядеть следующим образом:
Эта функция преобразует массивы следующим образом:
В этом:
Он не обрабатывает случаи со смешанным форматом, когда происходит такое столкновение:
Выход будет содержать только первое значение для этого ключа