2009-10-12 12 views
8

¿Por qué solo se envía un valor de la matriz de valores de casilla de verificación "db" al script del lado del servidor?Matriz de múltiples valores de casilla de verificación

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> 

Editar: acabé responder a mi propia pregunta, pero ¿alguien tiene la documentación (o una explicación) de por qué ¿esto es necesario? Me fue difícil encontrar la respuesta exacta (por lo tanto, la publicación póstuma).

+0

Claro, es documentado, ya que se utiliza php como script del lado del servidor, verifique aquí: http://www.php.net/manual/en/faq.html.php#faq.html.arrays y aquí: http://www.php.net/manual/ es/language.variables.external.php –

+1

Un poco fuera de tema, el valor 'for' de la etiqueta debería ser la identificación de entrada, no el valor de entrada. –

Respuesta

15

Acepto el secreto de @jjclarkson. Sólo para añadir, en lugar de empujar sus identificaciones a un array, puede utilizar $.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

¿Es más eficiente usar .map()? – jjclarkson

+0

@jjclarkson - no estoy seguro, pero es más corto y más a la vista. Dicho esto, he estado utilizando el enfoque $ .each hasta que descubrí $ .map, no he notado ninguna diferencia, pero en general, no creo que uno notará ninguna diferencia para un conjunto de datos de tamaño pequeño a mediano. – karim79

4

Debe tener los corchetes para especificar una matriz [] en el nombre de la variable enviada.

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

luego explotar 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); } 
}); 
Cuestiones relacionadas