Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Решил написать свою альтернативу $.post $.get JQuery

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Помогите собрать данные для отправки
Contr
Отправлено: 10 Декабря, 2014 - 15:32:27
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Спойлер (Отобразить)

У меня получается отправить JSON, а сервер его не понимает и посылает меня на х*й => поэтому надо как массив, понятный php (data[0][key] piket1)
Как это сделать?
Прикреплено изображение (Нажмите для увеличения)
1.PNG

(Отредактировано автором: 10 Декабря, 2014 - 15:35:04)

 
 Top
esterio
Отправлено: 10 Декабря, 2014 - 16:22:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




так вы JSON передали как ключ, как теперь пых отличит JSON от application/www-x-form-urlencode d формата. и во вторых при ПОСТ запросе нужно явно указивать данный заголовок.

Также непонятно то, что вы используете XmlHttpRequest 2 и в ручную парсите JSON, в то время как можно указать
CODE (javascript):
скопировать код в буфер обмена
  1. xhr.responseType = "json";

то же самое касаеться onreadystatechange вместо onload

также стоит учесть то что при обходе обьекта в for..in туда могут попасть свойства з пртотипа обьекта. для этого делают
CODE (javascript):
скопировать код в буфер обмена
  1. if(obj.hasOwnProperty(key)){}

также var key можно винести из цикла.

в общем возьмите годную статью и почитайте как делать правильно

(Отредактировано автором: 10 Декабря, 2014 - 16:42:30)

 
 Top
Contr
Отправлено: 10 Декабря, 2014 - 21:48:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




esterio пишет:
так вы JSON передали как ключ, как теперь пых отличит JSON от application/www-x-form-urlencode d формата. и во вторых при ПОСТ запросе нужно явно указивать данный заголовок.

Ну так помогите мне указать данный заголовок. Я вижу, что на сервере передан не массив php с квадратными скобками, а JSON-объект. У меня два выхода: либо грамотно что-то где-то указать, либо руками собирать массив d[][]...

Какой тут нужен код?
 
 Top
OrmaJever
Отправлено: 10 Декабря, 2014 - 22:11:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Contr пишет:
а сервер его не понимает и посылает меня на х*й

стоп, на этом давайте остановимся. Во-первых что приходит на сервер в массиве $_POST?
при вызове
CODE (javascript):
скопировать код в буфер обмена
  1. fn.post = transmit('POST');

(Отредактировано автором: 10 Декабря, 2014 - 22:13:21)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 11 Декабря, 2014 - 00:57:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




OrmaJever
там насколько я понял по коду возвращаеться вункция которая принимает три аргумента URL, Error и Success. причем если указан третий аргумент как функция то второй никак не влияет на логику приложения. хотя если указан второй как обект а третий не указан то тогда ошибка визова калбека будет. ну я так понял по коду приведенном више
Contr пишет:
либо руками собирать массив d[][]...

именно так и нужно делать
http://stackoverflow[dot]com/questio[dot][dot][dot]avascript-object
также посмотрите сюда https://developer[dot]mozilla[dot]org/en[dot][dot][dot]Web/API/FormData
Цитата:
The field's value. Can be a Blob, File, or a string, if neither, the value is converted to a string.

вы передаете строку (JSON масив в строке если быть точным) и хотите чтобы пых сам понял то с этим нужно ему делать
 
 Top
Contr
Отправлено: 11 Декабря, 2014 - 08:16:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




OrmaJever пишет:
стоп, на этом давайте остановимся. Во-первых что приходит на сервер в массиве $_POST?

Спойлер (Отобразить)

esterio пишет:
там насколько я понял по коду возвращаеться вункция которая принимает три аргумента URL, Error и Success. причем если указан третий аргумент как функция то второй никак не влияет на логику приложения. хотя если указан второй как обект а третий не указан то тогда ошибка визова калбека будет

Это я исправлю. Меня больше волнует как отправить данные на сервер также, как это делает $.post. Не понял
(Добавление)
Я вот думаю, может
1) отказаться от new FormData(),
2) добавить xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
3) сформировать данные (?)
с третьим пунктом проблемы... Растерялся
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Декабря, 2014 - 08:42:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Ня:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.     function createXhr() {
  3.  
  4.         var xhr;
  5.         try {
  6.             xhr = new XMLHttpRequest();
  7.         } catch (trymicrosoft) {
  8.             try {
  9.                 xhr = new ActiveXObject('Msxm12.XMLHTTP');
  10.             } catch (othermicrosoft) {
  11.                 try {
  12.                     xhr = new ActiveXObject('Microsoft.XMLHTTP');
  13.                 } catch (failed) {
  14.                     xhr = null;
  15.                 }
  16.             }
  17.         }
  18.         return xhr;
  19.  
  20.     }
  21.  
  22.     function sendGetRequest(params/*url, callback, cache*/) {
  23.  
  24.         params.callback = params.callback || function() {};
  25.         if (!params.cache) {
  26.             params.url += (params.url.match(/\?/) ? '&' : '?') + '_=' + Math.random();
  27.         }
  28.  
  29.         var xhr = createXhr();
  30.         if (xhr) {
  31.             xhr.open('GET', params.url, true);
  32.             xhr.onreadystatechange = function() {
  33.                 if (xhr.readyState == 4 && xhr.status == 200) {
  34.                     prepareResponseBody(xhr, xhr.responseText, params.callback);
  35.                 }
  36.             };
  37.             xhr.send(null);
  38.         }
  39.  
  40.     }
  41.  
  42.     function sendPostRequest(params/*url, data, callback*/) {
  43.  
  44.         params.data     = params.data || {};
  45.         params.callback = params.callback || function() {};
  46.  
  47.         var xhr = createXhr(), i, data = [];
  48.         if (xhr) {
  49.             xhr.open('POST', params.url, true);
  50.             xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  51.             xhr.onreadystatechange = function() {
  52.                 if (xhr.readyState == 4 && xhr.status == 200) {
  53.                     prepareResponseBody(xhr, xhr.responseText, params.callback);
  54.                 }
  55.             };
  56.             for (i in params.data) {
  57.                 data.push(i + '=' + encodeURIComponent(params.data[i]));
  58.             }
  59.             xhr.send(data.join('&'));
  60.         }
  61.  
  62.     }
  63.  
  64.     function prepareResponseBody(xhr, response, callback) {
  65.  
  66.         var data;
  67.         try {
  68.             data = (JSON && JSON.parse) ? JSON.parse(response) : eval('(' + response + ')');
  69.         } catch (e) {
  70.             data = null;
  71.         }
  72.         xhr = null;
  73.         response = null;
  74.  
  75.         if (data) {
  76.             callback(data);
  77.         }
  78.  
  79.     }
  80.  

Юзать:
CODE (javascript):
скопировать код в буфер обмена
  1. // по умолчанию запрос не кушируется
  2. sendGetRequest({
  3.     url: '/blah',
  4.     callback: function(data) {
  5.         console.log(data);
  6.     }
  7. });
  8.  
  9. sendPostRequest({
  10.     url: '/blah',
  11.     data: {
  12.         a: 1,
  13.         b: 2
  14.     },
  15.     callback: function(data) {
  16.         console.log(data);
  17.     }
  18. });
 
 Top
Contr
Отправлено: 11 Декабря, 2014 - 10:40:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




DeepVarvar,
у Вас получится отправить
CODE (javascript):
скопировать код в буфер обмена
  1. var values = {};
  2. for (var i = 0; i < elements.length; i++) {
  3.     values[i] = {
  4.         'key': elements[i].id,
  5.         'val': elements[i].value
  6.     };
  7. }
  8.  
  9. 'data': values


вот такой многомерный массив?

(Отредактировано автором: 11 Декабря, 2014 - 10:40:42)

 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Декабря, 2014 - 10:42:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Нет, а зачем именно такой? Почему обычный формат $_POST не подходит?
Ну всмысле:
PHP:
скопировать код в буфер обмена
  1.     '1' => array('key' => 'a', 'value' => 'A'),
  2.     '2' => array('key' => 'b', 'value' => 'B'),
  3.     '3' => array('key' => 'c', 'value' => 'C')
  4. )

а не:
PHP:
скопировать код в буфер обмена
  1.     'a' => 'A',
  2.     'b' => 'B',
  3.     'c'=> 'C'
  4. )

???
 
 Top
Contr
Отправлено: 11 Декабря, 2014 - 10:59:20
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




DeepVarvar пишет:
Нет, а зачем именно такой? Почему обычный формат $_POST не подходит?

Обычный подходит, просто дело вот в чем: JQuery умеет разбирать объект на массив, и я хочу. Сейчас по нашему коду получается так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Исходный код
  2. typenum=6&data=%5Bobject%20Object%5D

а надо так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. data[0][key]    piket1
  2. data[0][val]    4000
  3. data[1][key]    metr1
  4. data[1][val]    0
  5. data[2][key]    piket2
  6. data[2][val]    4100
  7. data[3][key]    metr2
  8. data[3][val]    10
  9. data[4][key]    about
  10. data[4][val]    текст
  11. typenum 6

или в записи это выглядит так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Исходный код
  2. typenum=6&data%5B0%5D%5Bkey%5D=piket1&data%5B0%5D%5Bval%5D=4000&data%5B1%5D%5Bkey%5D=metr1&data%5B1%5D%5Bval%5D=0&data%5B2%5D%5Bkey%5D=piket2&data%5B2%5D%5Bval%5D=4100&data%5B3%5D%5Bkey%5D=metr2&data%5B3%5D%5Bval%5D=10&data%5B4%5D%5Bkey%5D=about&data%5B4%5D%5Bval%5D=%D1%82%D0%B5%D0%BA%D1%81%D1%82

Мне как, перебором сделать?
вот здесь:
CODE (javascript):
скопировать код в буфер обмена
  1. if(data){
  2.     sendData = [];
  3.     for(var key in data){
  4.            //Где-то здесь
  5.            sendData.push(key + '=' + encodeURIComponent(data[key]));
  6.     }
  7.     sendData = sendData.join('&');
  8. }
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Декабря, 2014 - 11:03:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Да, именно в этом месте, можно даже вынести в отдельную ф-цию. И прогнать там весь обьект. А что, именно в том как прогнать обьект и есть твоя загвоздка?
 
 Top
Contr
Отправлено: 11 Декабря, 2014 - 11:04:00
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




DeepVarvar пишет:
Да, именно в этом месте, можно даже вынести в отдельную ф-цию. И прогнать там весь обьект. А что, именно в том как прогнать обьект и есть твоя загвоздка?

Да. Сейчас буду мучаться... Не понял
 
 Top
Contr
Отправлено: 11 Декабря, 2014 - 11:51:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Чего-то не осилил...
пробовал так:
Спойлер (Отобразить)

Напомню, надо собрать массив как на рисунке.
Как числовой массив собрать - получается, а как сделать с текстом? d[0][key]
Вот key то как запихнуть в квадратные скобки?
Прикреплено изображение (Нажмите для увеличения)
1(3).PNG
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Декабря, 2014 - 13:35:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Тебе надо собрать вот такую структуру:
CODE (javascript):
скопировать код в буфер обмена
  1. {
  2.     "0": {
  3.         key: "xxx",
  4.         val: "zzz"
  5.     },
  6.     "2": {
  7.         key: "qqq",
  8.         val: "www"
  9.     }
  10. }

Тогда:
CODE (javascript):
скопировать код в буфер обмена
  1. for (var i in obj) {
  2.     for (var k in obj[i]) {
  3.         data.push('data[' + i +'][' + k + ']=' + encodeURIComponent(obj[i][k]));
  4.     }
  5. }
  6. console.log(data.join('&'));
 
 Top
Contr
Отправлено: 11 Декабря, 2014 - 14:00:12
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Вот я и пытаюсь...
Пусть есть
var d = JSON.parse('{"0":{"key":"piket1","val":"4100"},"1":{"key":"metr1","val":"10"},"2":{"key":"piket2","val":"4200"},"3":{"key":"metr2","val":"20"},"4":{"key":"about","val":"text"}}');


CODE (javascript):
скопировать код в буфер обмена
  1. function iterator(res, obj) {
  2.   var val;
  3.   for (key in obj) {
  4.     val = obj[key];
  5.     if (Object.prototype.toString.call(val) === '[object Object]') {
  6.       res += '[' + key + ']';
  7.       iterator(res, val);
  8.     } else {
  9.       res += '=' + val + '&';
  10.     }
  11.   }
  12.   console.log( res );
  13. }
  14.  
  15.  
  16. iterator("d", d);

(Добавление)
Как такое собрать?

"data[0][key]=piket1&data[0][val]=4000&data[1][key]=metr1&data[1][val]=0&data[2][key]=piket2&data[2][val]=4100&data[3][key]=metr2&data[3][val]=10&data[4][key]=about&data[4][val]=текст"

Не получается... Хм
(Добавление)
Ну вот более-менее:
Спойлер (Отобразить)

(Отредактировано автором: 11 Декабря, 2014 - 14:12:13)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB