Как передать многомерный массив методом POST при помощи php или javascript?

12
C
На сайте с 04.02.2005
Offline
277
#11

2анонимус, который плюхнул в репу кирпич (хрен с ним)

POST-параметры

Параметры отделяются друг от друга знаком "&", а имя и значение параметра разделены знаком "=". Строка так называемых POST-параметров ничем не отличается от строки GET-параметров. Все зависит от места ее расположения. Если она включена в конец URL после знака "?", то ее называют строкой GET-параметров. Если она включена в тело POST-запроса, то ее называют строкой POST-параметров. Единственное и весьма важное различие между ними является следствием ограничения длины URL: на строку GET-параметров накладывается ограничение по длине, чего нет в отношении строки POST-параметров.
U5
На сайте с 03.06.2010
Offline
24
#12
POST-параметры

Параметры отделяются друг от друга знаком "&", а имя и значение параметра разделены знаком "=". Строка так называемых POST-параметров ничем не отличается от строки GET-параметров. Все зависит от места ее расположения. Если она включена в конец URL после знака "?", то ее называют строкой GET-параметров. Если она включена в тело POST-запроса, то ее называют строкой POST-параметров. Единственное и весьма важное различие между ними является следствием ограничения длины URL: на строку GET-параметров накладывается ограничение по длине, чего нет в отношении строки POST-параметров.

Итак, имеется форма для отправки данных. У формы проставлено значение ENCTYPE="multipart/form-data" . Есть характеристика name="ING[10][y0]" value="999". Эта характеристика приходит в виде многомерного массива, проверял таким кодом.


foreach($_POST as $index => $val) {
if( $index == "ING" ) {
print "$index=";
print gettype($val);
}
}

На этот же пробный код отправлял запросы через форму, java, и php. В первых двух случаях $val определялась как массив, со всеми ключами. В случаи php как строка со значением array.

User5 добавил 17.11.2011 в 20:20

Jekyll:
Вы можете манипулировать с данными, до того как с ними начнёт работать обработчик? Вам нужно использовать unserialize()

Увы, к обработчику я не имею доступа.

C
На сайте с 04.02.2005
Offline
277
#13

foreach($_POST as $index => $val) {
if( $index == "ING" ) {
print "$index=";
print gettype($val);
}
}

Не проверяя:

print "$index="; -> array()=

print gettype($val); -> array

print '$index'; -> $index

print gettype($val); -> array -> array

рекомендую ознакомиться с функцией

print_r

foreach($_POST as $index => $val) {
if( $index == "ING" ) {
print_r ($val);
}
}
U5
На сайте с 03.06.2010
Offline
24
#14

А этот код к чему? К обработчику я не имею доступа...

C
На сайте с 04.02.2005
Offline
277
#15

Вы показали "пробный" код и говорит, что выводит array

так я показываю, что вывод разный будет.

Вы имеете доступ к форме?

элементы формы с атрибутом name будут переданы скрипту обрабатывающему запрос.

Вы не знаете что в обработчике, но знаете какие поля он принимает .

Не могу понять в чем или где проблема?

U5
На сайте с 03.06.2010
Offline
24
#16
Chukcha:
Вы показали "пробный" код и говорит, что выводит array

так я показываю, что вывод разный будет.

Вы имеете доступ к форме?
элементы формы с атрибутом name будут переданы скрипту обрабатывающему запрос.
Вы не знаете что в обработчике, но знаете какие поля он принимает .

Не могу понять в чем или где проблема?

Проблема в том что curl не умеет отправлять многомерные массивы. Лучшее что я накопал в документации к нему это

Be careful when setting the CURLOPT_POSTFIELDS setting using an array. The array used to set the POST fields must only contain scalar values. Multidimentional arrays or objects lacking a __toString implementation will cause Curl to error.

If there is a need to send non-scalar values using a POST request, consider serializing them before transmission.


$ch = curl_init('http://host.example.com');


// Data to post
$multiDimensional = array(
'name' = 'foo',
'data' = array(1,2,3,4),
'value' = 'bar'
);

// Will error
curl_setopt($ch, CURLOPT_POSTFIELDS, $multiDimensional);

// Data to post
$postData = array(
'name' = 'foo',
'data' = serialize(array(1,2,3,4)),
'value' = 'bar'
);

// Will not error
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

ДП
На сайте с 23.11.2009
Offline
203
#17

Так вы сами можете из массива сделать строку post-запроса и уже ее передать в curl. В $postData чтобы было что-то типа arr[1][3]=value&arr[1][4]=other_value

C
На сайте с 04.02.2005
Offline
277
#18

вздохнул....

CURLOPT_POSTFIELDS Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1&para2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @, value должен быть массивом.

$postData = '?name=foo&data[0]=1&data[1]=2& ...'

Chukcha добавил 17.11.2011 в 21:26

Дикий пионер:
Так вы сами можете из массива сделать строку post-запроса и уже ее передать в curl. В $postData чтобы было что-то типа arr[1][3]=value&arr[1][4]=other_value

Я это твержу с самого начала, в том числе и соседней ветке.

U5
На сайте с 03.06.2010
Offline
24
#19

Вот как все просто оказалось... Не надо создавать никаких массивов и т.д. Ну, огромное спасибо за помощь :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий