2016-07-18 3 views
0

Я пытаюсь передать массив из jQuery в PHP.Как передать массив со всеми элементами с jquery в php

<input type="checkbox" id="name1" name="name[]" value="name1"> Name1 
<input type="checkbox" id="name2" name="name[]" value="name2"> Name2 
<input type="checkbox" id="name3" name="name[]" value="name3"> Name3<br /> 

<input type="checkbox" id="phone1" name="phone[]" value="samsung"> Samsung 
<input type="checkbox" id="phone2" name="phone[]" value="nokia"> Nokia 
<input type="checkbox" id="phone3" name="phone[]" value="motorola"> Motorola<br /> 
$(document).ready(function() { 
    $(":checkbox").on('change', function() { 
     var group = []; 
     var mygroup = {}; 

     $(':checkbox:checked').each(function(i){  
      var val = this.value; 
      var name = this.name; 
      mygroup[name] = val; 
      var all = name + "=" + val; 
      group.push(all); 

      $.ajax({ 
       type: "POST", 
       url: 'testdraft1.php', 
       data: mygroup, // TRIED WITH group and all also. Doesn't work. 
       success: function(data) { 
        $("#result").html(data); 
       } 
      });  
     }); 
    }); 
}); 

С помощью этого кода массив передается в PHP, но только с 1 элементом. Даже если я выберу несколько элементов. Что я делаю не так?

+2

все ваши входы имеют одинаковые идентификаторы и имена. Измените это – Roysh

+1

Это потому, что вы инициализируете массив каждый раз, когда есть изменения в флажке. Переместить массив вне '$ (": checkbox "). On ('change', function() {' – Pugazh

+0

Изменено, оно все равно делает то же самое. Все еще не включает все элементы. – Somename

ответ

1

Это работает и, возможно, проще, чем использование FormData. (Обратите внимание, что я изменил name[] на name и phone[] на phone.) Я также переместил вызов AJAX за пределами цикла each.

HTML:

<input type="checkbox" id="name1" name="name" value="name1"> Name1 
<input type="checkbox" id="name2" name="name" value="name2"> Name2 
<input type="checkbox" id="name3" name="name" value="name3"> Name3<br /> 

<input type="checkbox" id="phone1" name="phone" value="samsung"> Samsung 
<input type="checkbox" id="phone2" name="phone" value="nokia"> Nokia 
<input type="checkbox" id="phone3" name="phone" value="motorola"> Motorola<br /> 

JavaScript:

$(document).ready(function() { 
    $(":checkbox").on('change', function() { 
     var mygroup = {}; 

     $(':checkbox:checked').each(function(i) { 
      var val = this.value; 
      var name = this.name; 

      mygroup[name] = (mygroup[name] || []).concat([val]); 
     }); 

     $.ajax({ 
      type: "POST", 
      url: 'testdraft1.php', 
      data: mygroup, 
      success: function(data) { 
       $("#result").html(data); 
      } 
     }); 
    }); 
}); 

EDIT

Эта линия немного запутанным:

mygroup[name] = (mygroup[name] || []).concat([val]); 

Вот более простая версия:

// initialize with an empty array if needed 
if (mygroup[name] === undefined) { 
    mygroup[name] = []; 
} 
// append the most recent value to the array 
mygroup[name].push(val); 
+0

@Pugazh @smarx Спасибо, господам спасибо за миллион не понял th concat, поэтому сделал и работает отлично. '$ (документ) .ready (функция() { \t $ (":") Флажок на ('Изменение', функция() { \t вар MyGroup = {}; \t \t \t $ (. ': флажок: проверено') каждый (функция (я) {\t \t \t \t вар Val = this.value; \t \t имя вар = this.name; \t \t \t \t .mygroup [name] = val; \t}); \t \t $ .ajax ({ \t \t типа: "POST", \t \t URL: 'testdraft1.php', \t \t данные: MyGroup, \t \t \t \t \t \t успех: функция (данные) { \t \t $ ("# result"). Html (data); } }); \t \t \t}); }); ' Пробовал оба кода п дает одинаковый результат Счастливый его работы богу, что в день – Somename

+0

@Somename, что код не возможно работать. Вы уверены, что это работает, когда вы отметили более одного флажка в той же группе? (Более одного имени или нескольких «телефонов»?) – smarx

+1

@Somename См. Мое редактирование, где я добавил более простую альтернативу для этой строки. – smarx

-1
<input type="checkbox" id="name1" name="name[]" value="name1"> Name1 
<input type="checkbox" id="name2" name="name[]" value="name2"> Name2 
<input type="checkbox" id="name3" name="name[]" value="name3"> Name3 

<br /> 

<input type="checkbox" id="phone1" name="phone[]" value="samsung"> Samsung 
<input type="checkbox" id="phone2" name="phone[]" value="nokia"> Nokia 
<input type="checkbox" id="phone3" name="phone[]" value="motorola"> Motorola 

<br /> 


$(document).ready(function() { 
    $(":checkbox").on('change', function() { 

    var group=[]; //DEFINED THE ARRAY 
    var mygroup = {}; // DEFINED THE OBJECT 

     $(':checkbox:checked').each(function(i){  

     var val= this.value; 
     var id = this.id; 

     mygroup[id]=val; //PUSH VALUES TO THE OBJECT mygroup 

     var all = id+"="+val; 

     group.push(all); // PUSH ALL CHECKBOX VALUES TO ARRAY 

    $.ajax({ 
     type: "POST", 
     url: 'testdraft1.php', 
     data : mygroup,    //TRIED WITH group and all also. Doesn't work. 
     success: function(data){ 
     $("#result").html(data); 
    } 
    }); 

    }); 
    }); 

}); 

Использование же имя, а изменение имени изменить имя ID это будет работает для вас

1

Вы вызываете AJAX пост внутри каждого цикла, что означает, если вы проверить пять ящиков пошлешь отдельный пост для каждой итерации каждого вызова.

Это означает, что первый пост будет иметь только один флажок, то второй пост будет иметь два и т.д.

Если вы действительно хотите сделать это, то вам необходимо закрыть каждую петлю до вашего АЯКСА вызова.

Это не решит проблему с именем, но это решит причину, по которой вы получаете только один флажок, отправленный на php.

+0

Ни один из вызовов не будет иметь более одного флажка для имени ('name []' или 'phone []'), так как 'mygroup' может иметь только одно значение для каждого ключа. – smarx

0

Есть несколько проблем, связанных с вашим кодом,

  1. код AJAX должен быть вне .each функции.
  2. Определить массив вне change событие.
  3. Вы не можете отправить массив напрямую, как это в запросе AJAX. Используйте для этого FormData.

Так изменить код так,

$(document).ready(function() { 
     var group = []; //DEFINED THE ARRAY 
     $(":checkbox").on('change', function() { 
      $(':checkbox:checked').each(function(i) { 
       var val = this.value; 
       var name = this.name; 
      var dataObject = {}; 
      dataObject.name = name; 
      dataObject.val = val; 

      group.push(dataObject); 

     }); 
     var fd = new FormData(); 
     for (var i = 0; i < group.length; i++) { 
      fd.append(group[i].name, group[i].val); 
     } 
     $.ajax({ 
      type: "POST", 
      url: 'testdraft1.php', 
      data: fd, 
      success: function(data) { 
       $("#result").html(data); 
      } 
     }); 
    }); 
}); 
+0

«Вы не можете отправить массив напрямую, как это в запросе AJAX. Используйте FormData для этого». Собственно, см. Мой ответ. Оказывается, jQuery обрабатывает массивы значений во многом так, как ожидает PHP. (Если вы отправляете '{foo: [1, 2, 3]}', jQuery кодирует это 'foo [] = 1 & foo [] = 2 & foo [] = 3', что является соглашением PHP.) – smarx

+0

Это правда. Мы можем отправить это тоже '{foo: [1, 2, 3]}' –

Смежные вопросы