2009-10-12 7 views
8

Pourquoi une seule valeur du tableau de valeurs de case à cocher "db" est-elle envoyée au script côté serveur?Tableau de valeurs de cases à cocher multiples

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> 

Modifier: Je fini par répondre à ma propre question, mais ce que quelqu'un a des documents (ou une explication) des raisons pour lesquelles Ceci est nécessaire? C'était difficile pour moi de trouver la réponse exacte (donc le post posthume).

+0

Bien sûr, il est documenté, puisque vous utilisez php en tant que script côté serveur, vérifiez ici: http://www.php.net/manual/en/faq.html.php#faq.html.arrays et ici: http://www.php.net/manual/ fr/language.variables.external.php –

+1

Un peu hors sujet, la valeur 'for' de l'étiquette devrait être l'identifiant d'entrée, pas la valeur d'entrée. –

Répondre

15

Je suis d'accord avec @jjclarkson. Il suffit d'ajouter, au lieu de pousser vos ids à un tableau, vous pouvez utiliser $.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

Est-il plus efficace d'utiliser .map()? – jjclarkson

+0

@jjclarkson - pas sûr, mais c'est plus court et plus visuellement. Cela dit, j'avais utilisé l'approche $ .each jusqu'à ce que je découvre $ .map, je n'ai pas remarqué de différence, mais en général, je ne pense pas qu'on remarquera de différence pour un ensemble de données de petite à moyenne taille. – karim79

4

Vous devez avoir les crochets pour spécifier un tableau [] sur le nom de la variable soumise.

{'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(",");

alors explode en 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); } 
}); 
Questions connexes