2009-10-12 16 views
8

Dlaczego tylko jedna wartość tablicy wartości pól wyboru "db" jest wysyłana do skryptu po stronie serwera?Tablica postów o wielu wartościach pól wyboru

JQUERY:

$(".db").live("change", function() { 
    $(this).add($(this).next("label")).add($(this).next().next("br")).remove().insertAfter(".db:last + label + br"); 
    var url = "myurl.php"; 
    var db = []; 
    $.each($('.db:checked'), function() { 
     db.push($(this).val()); 
    }); 
    if(db.length == 0) { 
     db = "none"; 
    }  
    $.post(url, {db: db}, function(response) { 
     $("#dbdisplay").html(response); 
    }); 
    return true; 
}); 

HTML:

<input type="checkbox" name="db[]" class="db" value="track"/><label for="track">track</label></br> 
<input type="checkbox" name="db[]" class="db" value="gps"/><label for="gps">gps</label></br> 
<input type="checkbox" name="db[]" class="db" value="accounting"/><label for="accounting">accounting</label></br> 

Edit: skończyło się odpowiedzi na moje własne pytanie, ale czy ktoś ma dokumentację (lub wyjaśnienie), dlaczego to jest niezbędne? Trudno było mi znaleźć dokładną odpowiedź (a więc pośmiertny post).

+0

Jasne, to udokumentowane, ponieważ używasz php jako skrypt po stronie serwera, sprawdź tutaj: http://www.php.net/manual/pl/faq.html.php#faq.html.arrays i tutaj: http://www.php.net/manual/ pl/language.variables.external.php –

+1

Nieco poza tematem, wartość 'for' etykiety powinna być identyfikatorem wejściowym, a nie wartością wejściową. –

Odpowiedz

15

Zgadzam się z @jjclarkson. Wystarczy dodać, zamiast pchać swoje identyfikatory do tablicy, można użyć $.map:

$(".db").live("change", function() { 
    $(this).add($(this).next("label")).add($(this).next().next("br")).remove().insertAfter(".db:last + label + br"); 
    var url = "myurl.php"; 

    var db = $('.db:checked').map(function(i,n) { 
     return $(n).val(); 
    }).get(); //get converts it to an array 

    if(db.length == 0) { 
     db = "none"; 
    }  
    $.post(url, {'db[]': db}, function(response) { 
     $("#dbdisplay").html(response); 
    }); 
    return true; 
}); 
+0

Czy korzystanie z .map() jest bardziej wydajne? – jjclarkson

+0

@jjclarkson - nie jestem pewien, ale jest krótszy i bardziej wzniosły. Powiedziałem, że używałem podejścia $ .each, dopóki nie odkryłem $ .map, nie zauważyłem żadnej różnicy, ale ogólnie, nie sądzę, że zauważymy jakąkolwiek różnicę dla małego i średniego zestawu danych. – karim79

4

Musisz mieć nawiasy kwadratowe, aby określić tablicę [] na przedłożonej nazwie zmiennej.

{'db[]': db} 

$(".db").live("change", function() { 
    $(this).add($(this).next("label")).add($(this).next().next("br")).remove().insertAfter(".db:last + label + br"); 
    var url = "myurl.php"; 
    var db = []; 
    $.each($('.db:checked'), function() { 
     db.push($(this).val()); 
    }); 
    if(db.length == 0) { 
     db = "none"; 
    }  
    $.post(url, {'db[]': db}, function(response) { 
     $("#dbdisplay").html(response); 
    }); 
    return true; 
}); 
1

$('input[name="mycheckboxes"]:checked').map(function(){ return $(this).val(); }).get().join(",");

następnie eksplodować w PHP $mycheckboxes = explode(',',$_GET['mycheckboxes']);

5
var checkeditems = $('input:checkbox[name="review[]"]:checked') 
         .map(function() { return $(this).val() }) 
         .get() 
         .join(","); 
$.ajax({ 
    type: "POST", 
    url: "/index.php/openItems/", 
    data: "ids=" + checkeditems,           
    success: function(msg) { $(".mainContainer").html(msg); } 
}); 
Powiązane problemy