php curl многомерный массив
karamani
Размышления о проектировании и разработке программного обеспечения
Curl, многомерные массивы и передача файлов
Задача: из кода на PHP передать веб-службе файл с помощью curl.
Решение стандартное и достаточно простое, но, как обычно, при программировании на PHP есть нюансы.
Инициализируем библиотеку curl, формируем данные для POST-запроса, одним из параметров устанавливаем путь к передаваемому файлу, который обязательно начинаем со значка “собаки”.
Всё прошло отлично. Curl самостоятельно принял решение об использовании при передаче запроса алгоритма multipart/form-data и передал файл веб-службе. На её стороне файл сохранён с именем /tmp/phpfdWZF6.
Теперь попробуем изменить параметры запроса, добавив туда вложенные массивы.
Т.к. параметры запроса были переданы строкой, то библиотека curl проявила интеллект и начала использовать алгоритм передачи данных application/x-www-form-urlencoded, который не имеет даже теоретической возможности передачи файла. Продолжаем борьбу. Устанавливаем принудительно в заголовках запроса нужный нам тип контента.
После этого у нас вообще перестаёт работать отправка запроса. Ни параметры запроса, ни файл веб-служба не получает. А всё потому, что начиная с PHP версии 5.2.0 при передаче файлов с префиксом “@” значение в CURLOPT_POSTFIELDS обязательно должно быть массивом. С одной стороны, чтобы передать многоуровневый массив, нам нужна строка. С другой стороны, для передачи файла нужен массив.
Решение, как обычно, посередине. Строим одноуровневый массив с такими ключами, какими они были бы при формировании строки. Т.е. приводим наши параметры к такому виду.
И вот теперь мы, наконец-то, получили то, что хотели.
Осталось написать универсальное решение, которое бы преобразовывало любые многоуровневые массивы в одноуровневые. Тут на помощь приходит простенькая рекурсия.
Тестируем последний раз.
Убеждаемся, что всё работает, и отправляемся на поиски новых открытий в прекрасном и удивительном мире программирования на PHP.
Проводка многомерного массива с PHP и CURL
У меня возникли проблемы с отправкой данных формы через CURL получающему PHP script, расположенному на другом узле.
Я получаю ошибку Array to string conversion
Это print_r массива, который я публикую:
Это строка, в которой происходит ошибка:
Также у меня нет доступа к коду на принимающем хосте, поэтому я не могу сериализовать и неэтериализовать массив.
Я предполагаю, что значение ключа имени, являющегося массивом, является причиной этой ошибки, я также предполагаю, что CURLOPT_POSTFIELDS не поддерживает многомерные массивы. Есть ли другой способ обойти это или я обречен?
ОТВЕТЫ
Ответ 1
Вам нужно будет построить строку POST вручную, а не передавать весь массив. Затем вы можете переопределить curl auto-selected content header:
Сериализация/json-ifying будет проще, но, как вы говорите, у вас нет контроля над принимающим концом, поэтому вам нужно сделать немного дополнительной работы.
Ответ 2
Например, когда вы POST-массив из формы, элементы формы часто выглядят примерно так:
Хотя PHP знает, что делать с этими данными, когда он его получает (т.е. строит массив), в HTML и HTTP, у вас есть три несвязанных ввода, которые просто имеют сходные (или то же, хотя это не так технически допустимые HTML).
Чтобы сделать обратный для вашего запроса cURL, вам необходимо разложить массив на строковые представления ключей. Итак, с вашим массивом name вы можете сделать что-то вроде:
И тогда каждый ключ в массиве, который вы публикуете, будет скалярным значением, которое ожидает cURL, и массив будет представлен так, как вам нужно для HTTP.
Ответ 3
Ответ 4
Ниже приведен пример кода, где это используется в реальной жизни:
Ответ 5
Сначала я хотел бы поблагодарить Daniel Vandersluis за его проницательный ответ. Основываясь на его вводе, я придумал это, чтобы исправить проблему из оригинального вопроса:
Использование должно выглядеть следующим образом:
Эта функция преобразует массивы следующим образом:
Он не обрабатывает случаи со смешанным форматом, когда есть столкновение клавиш, подобное этому:
Выход будет содержать только первое значение для этого ключа
Ответ 6
Я думаю, вам нужно передать параметры в виде строки:
Затем вы можете настроить заголовок вручную с помощью CURLOPT_HTTPHEADER.
Ответ 7
Разноска многомерного массива с помощью PHP и CURL
У меня проблемы с отправкой данных формы через CURL в принимающий скрипт PHP, расположенный на другом хосте.
Я получаю Array to string conversion ошибка
Это print_r массива, который я публикую:
Это строка, в которой происходит ошибка:
Кроме того, у меня нет доступа к коду на принимающем хосте, поэтому я не могу сериализовать и десериализовать массив.
7 ответов
Вам нужно будет создать строку POST вручную, а не передавать весь массив. Затем вы можете переопределить автоматически выбранный заголовок содержимого curl с помощью:
Сериализация /json-ifying будет проще, но, как вы говорите, у вас нет контроля над принимающей стороной, поэтому вам нужно проделать дополнительную работу.
Например, когда вы размещаете массив из формы, элементы формы часто выглядят примерно так:
Хотя PHP знает, что делать с этими данными при получении (т. е. создавать массив), для HTML и HTTP, у вас есть три несвязанных ввода, которые просто имеют одинаковые (или одинаковые, хотя это не так). технически допустимые HTML) имена.
Чтобы сделать обратное для вашего запроса cURL, вам нужно разложить ваш массив на строковые представления ключей. Итак, с вашим массивом name вы можете сделать что-то вроде:
Ниже приведен пример кода, где он используется в реальной жизни:
Использование должно выглядеть следующим образом:
Эта функция преобразует массивы следующим образом:
Он не обрабатывает случаи со смешанным форматом, когда есть столкновение клавиш, как это:
Вывод будет содержать только первое значение для этого ключа
Я думаю, вам нужно передать параметры в виде строки:
Затем вы сможете установить заголовок вручную через CURLOPT_HTTPHEADER.
Разноска многомерного массива с помощью PHP и CURL
у меня возникли проблемы с отправкой данных формы через CURL на принимающий PHP-скрипт, расположенный на другом хосте.
Я Array to string conversion
это print_r массива, который я публикую:
это строка, в которой происходит ошибка:
также у меня нет доступа к коду на принимающем хосте, поэтому я не могу сериализовать и отменить сериализацию массива.
Я предполагаю, что значение имя ключ, являющийся массивом, является причиной этой ошибки, я также предполагаю, что CURLOPT_POSTFIELDS не поддерживает многомерные массивы. Есть ли другой выход или я обречен?
8 ответов
вам нужно будет построить строку POST вручную, а не передавать весь массив. Затем вы можете переопределить автоматически выбранный заголовок содержимого curl с помощью:
сериализация/json-ifying было бы проще, но, как вы говорите, у вас нет контроля над принимающей стороной, поэтому у вас есть немного дополнительной работы.
например, когда вы публикуете массив из формы, элементы формы часто выглядят примерно так:
пока PHP знает, что делать с этими данными, когда он их получает (т. е. создайте массив), в HTML и HTTP у вас есть три несвязанных входа, которые просто имеют похожие (или одинаковые, хотя это не технически допустимые HTML) имена.
чтобы сделать обратное для вашего запроса cURL, вам нужно разложить массив на строковые представления ключей. Так и с вашим name массив, вы можете сделать что-то вроде:
и тогда каждый ключ в массиве, который вы публикуете, будет скаляр значение, которое ожидает cURL, и массив будет представлен так, как вам нужно для HTTP.
самое простое решение-сделать a:
Ниже приведен пример кода, где это используется в реальной жизни :
сначала я хотел бы поблагодарить Даниил Vandersluis за его глубокий ответ. Основываясь на его вводе, я придумал это, чтобы исправить проблему из исходного вопроса:
использование должно выглядеть так:
эта функция преобразует массивы следующим образом:
он не обрабатывает случаи со смешанным форматом, когда есть ключевое столкновение, такое как это:
выход будет содержать только первое значение для этого ключа
Я думаю, вам нужно будет передать параметры в виде строки:
затем вы сможете установить заголовок вручную с помощью CURLOPT_HTTPHEADER.
опция cURL CURLOPT_POSTFIELDS будет принимать либо строку, либо простой массив, но не вложенный массив. Попытка сделать это создаст Array to string conversion ошибка.
Проводка многомерного массива с PHP и CURL
У меня возникли проблемы с отправкой данных формы через CURL на PHP-скрипт приема, расположенный на другом хосте.
Я получаю ошибку Array to string conversion в Array to string conversion
Это print_r массива, который я публикую:
Это строка, в которой происходит ошибка:
Также у меня нет доступа к коду на принимающем хосте, поэтому я не могу сериализовать и неэтериализовать массив.
Я предполагаю, что значение ключа имени, являющегося массивом, является причиной этой ошибки, я также предполагаю, что CURLOPT_POSTFIELDS не поддерживает многомерные массивы. Есть ли какой-либо другой способ этого или я обречен?
Вам нужно будет построить строку POST вручную, а не передавать весь массив. Затем вы можете переопределить заголовок содержимого автозапуска curl с помощью:
Сериализация / json-ifying будет проще, но, как вы говорите, у вас нет контроля над получающим концом, поэтому вам нужно сделать немного дополнительной работы.
Например, когда вы POST массива из формы, элементы формы часто выглядят примерно так:
Хотя PHP знает, что делать с этими данными, когда он его получает (т. Е. Строит массив), в HTML и HTTP, у вас есть три несвязанных ввода, которые просто имеют сходные (или то же, хотя это не технически корректный HTML ).
Чтобы сделать обратное для вашего запроса cURL, вам нужно разложить свой массив на строковые представления ключей. Итак, с вашим массивом name вы можете сделать что-то вроде:
И тогда каждый ключ в массиве, который вы публикуете, будет скалярным значением, ожидаемым cURL, и массив будет представлен так, как вам нужно для HTTP.
Самое простое решение:
Ниже приведен пример кода, где это используется в реальной жизни:
Использование должно выглядеть следующим образом:
Эта функция преобразует массивы следующим образом:
Он не обрабатывает случаи со смешанным форматом, когда происходит такое столкновение:
Выход будет содержать только первое значение для этого ключа
Я думаю, вам нужно передать параметры в виде строки:
Затем вы можете настроить заголовок вручную через CURLOPT_HTTPHEADER.