Controlar array de checkboxes con PHP
En este artículo vamos a ver como controlar un grupo de checkboxes guardados en un array con PHP.
El componente checkbox permite seleccionar una opción al usuario del programa o página Web con el objetivo de tomar una decisión directamente en pantalla. Esta situación se puede dar en muchos circumstancias.
En el ejemplo que vamos a ilustrar vamos a tener un listado de paises agrupados por continentes dando la opción al usuario de elegir los paises que desee.
La idea no es más que un formulario con inputs checkboxes y un botón submit. La lista de checkboxes la pondremos de la siguiente forma:
<input type="checkbox" value="España" name="countries[]" /><label>España</label><br/> <input type="checkbox" value="Portugal" name="countries[]" /><label>Portugal</label><br/> <input type="checkbox" value="Francia" name="countries[]" /><label>Francia</label><br/> ...
Sobretodo te tienes que fijar en el atributo «name» de los inputs que no es más que un array y también es importante su valor.
Y el botón:
<input type="submit" name="enviar" value="enviar" />
Ahora, viene la clave del asunto. Nos interesa controlar que paises ha checkeado el usuario. ¿Cómo controlaremos estos datos?
<?php if (isset($_POST['enviar'])) { if (is_array($_POST['countries'])) { $selected = ''; $num_countries = count($_POST['countries']); $current = 0; foreach ($_POST['countries'] as $key => $value) { if ($current != $num_countries-1) $selected .= $value.', '; else $selected .= $value.'.'; $current++; } } else { $selected = 'Debes seleccionar un país'; } echo '<div>Has seleccionado: '.$selected.'</div>'; } ?>
El código de control anterior lo puedes situar por debajo de la etiqueta <body> y lo que estamos indicando es que si se ha pulsado el botón de enviar. Comprobamos si es un array la variable «countries» enviada por POST, y si lo es recorremos el array obteniendo su valor finalmente imprimiéndolo por pantalla.
Muchas gracias José Aguilar, fue de mucha ayuda tu post
Hola espero estes bien.
Esto realizando una consulta que me muestra la información a traves de checkboxes dinámico de diferentes tablas de acuerdo a una condición que se cumpla. Ali el usuario podrá mirar y seleccionar los registros que desea guardar y asignarle el correlativo por grupo de proveedor a varias facturas.
Esta es mi consulta:
sqlsrv_query($conn,$sql=»SELECT
Impuesto_Comprobante.RCRTCD AS Impuesto_Comprobante_RCRTCD,
Temporal_Impuesto.APCMPY AS Temporal_Impuesto_APCMPY,
Temporal_Impuesto.APVNDR AS Temporal_Impuesto_APVNDR,
Temporal_Impuesto.APINV AS Temporal_Impuesto_APINV,
Temporal_Impuesto.APIRRF AS Temporal_Impuesto_APIRRF,
Temporal_Impuesto.VENDOR AS Temporal_Impuesto_VENDOR,
Temporal_Impuesto.TXCOMP AS Temporal_Impuesto_TXCOMP,
Temporal_Impuesto.TXVNDR AS Temporal_Impuesto_TXVNDR,
Temporal_Impuesto.TXTRCD AS Temporal_Impuesto_TXTRCD,
Temporal_Impuesto.TXRATE AS Temporal_Impuesto_TXRATE,
Temporal_Impuesto.TXINV AS Temporal_Impuesto_TXINV,
Temporal_Impuesto.TXTYPE AS Temporal_Impuesto_TXTYPE,
Temporal_Impuesto.TXTXBA AS Temporal_Impuesto_TXTXBA,
Temporal_Impuesto.TXTXTC AS Temporal_Impuesto_TXTXTC,
Temporal_Impuesto.TXTAXT AS Temporal_Impuesto_TXTAXT,
Temporal_Impuesto.TXIDTE AS Temporal_Impuesto_TXIDTE,
Temporal_Impuesto.AINVDT AS Temporal_Impuesto_AINVDT,
Temporal_Impuesto.VNDNAM AS Temporal_Impuesto_VNDNAM,
Impuesto_Comprobante.Tipo_Comprobante AS Impuesto_Comprobante_Tipo_Comprobante
FROM
dbo.Temporal_Impuesto Temporal_Impuesto INNER JOIN dbo.Impuesto_Comprobante Impuesto_Comprobante ON Temporal_Impuesto.TXTRCD = Impuesto_Comprobante.RCRTCD
WHERE Impuesto_Comprobante.ID_Tipo_Comprobante =’1′ ORDER BY Temporal_Impuesto_TXVNDR»);
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
Aqui despliego la tabla con la informacion
while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ){
echo «».$row[‘Temporal_Impuesto_AINVDT’].
«».$row[‘Temporal_Impuesto_VNDNAM’].
«».$row[‘Temporal_Impuesto_APINV’].
«».$row[‘Temporal_Impuesto_APIRRF’].
«».round($total=$row[‘Temporal_Impuesto_TXTXBA’]+$row[‘Temporal_Impuesto_TXTAXT’],2).
«».round($row[‘Temporal_Impuesto_TXTXBA’],2).
«».round($row[‘Temporal_Impuesto_TXRATE’],2).
«».round($row[‘Temporal_Impuesto_TXTXTC’],2).
««.»»;
}
Lo que no logro es poder pasar los datos seleccionados y asignarles el correlativo que corresponde y registrar.
Intente ejecutarlo con el siguiente código pero solo me devuelve un campo:
include»Conexion_Impuestos.php»;
if (isset($_POST[‘Enviar’])) {
if (is_array($_POST[‘opcion’])) {
$selected = »;
$num_opciones = count($_POST[‘opcion’]);
// echo $num_opciones;
$current = 0;
foreach ($_POST[‘opcion’] as $key => $value) {
if ($current != $num_opciones-1)
$selected .= $value.’, ‘;
$selected .= $value.’.’;
$current++;
echo $selected;
}
$hoy = date(«yym»);
// echo $hoy;
sqlsrv_query($conn,$sql1=»SELECT Correlativo_Inicial from dbo.Correlativo»);
$stmt1= sqlsrv_query( $conn, $sql1);
if( $stmt1 === false) {
die( print_r( sqlsrv_errors(), true) );
}
Hola,
Dejaré este tema abierto por si alguien tiene una solución.
Si necesitas resolver con urgencia, envía un ticket al centro de soporte técnico para que podamos estudiar y valorar tu petición desde el siguiente enlace:
https://www.jose-aguilar.com/modulos-prestashop/es/soporte
Saludos
Hola José de antemano muchas gracias por el aporte, pregunta, estoy ejecutando tu ejemplo y funciona genial, ¿Como le haría para obtener el valor seleccionado y pasar este a otro formulario por POST,? debido a devuelve el valor sobre el mismo formulario, pero si en el action del form coloco un formulario no pasa el valor, como podría realizarlo.
Hola,
Entiendo que puedes hacerlo con 2 formularios diferentes. En el segundo formulario recoge el valor enviado en el primero capturándolo con $_POST.
Saludos
Buen día José, me ha sido de mucha ayuda tu ejemplo, ¿ tendrás algún otro en donde automáticamente te vaya pintando el país seleccionado sin necesidad de darle click al botón «enviar», o similar que haga esta función ?.
Gracias
Hola,
Para eso necesitarás controlar el evento click de cada checkbox con el objetivo de leer su valor e imprimirlo en pantalla. Esto lo puedes hacer con JavaScript.
Saludos
disuculpa como podría implementar el value=»» si los valores los estoy obteniendo de un array?
ya vi lo que contestaste a adrian es mas o menos mi caso.
pero entonces como lo implemento?
Hola,
Si los valores o países vienen de la base de datos en un array, deberás recorrer este array con un foreach, por ejemplo, y dentro del mismo colocar todos los inputs tipo checkbox con su valor correspondiente.
Saludos
Hola
Muy bueno, casi es lo que estaba buscando excepto porque cambie los países por salarios y al final debo sumar los seleccionados pero a pesar de mis esfuerzos sigue mostrando la lista de salarios. Alguna idea que puedas darme para solucionarlo
Gracias 🙂
Hola,
Nos tendrás que explicar con más detalles que ocurre con tu código. Puedes enviarnos toda la información a nuestro centro de soporte técnico para que lo podamos ver en detalle. Puedes enviar un ticket desde:
https://www.jose-aguilar.com/modulos-prestashop/es/soporte
Saludos
Hola tengo un listado con chekbox, mi problema es que cuando paso por metodo POST los checbox seleccionados solo me pasa el valor de 200 y mi listado suele variar pueden ser 100 o pueden ser 900 y del 200 en adelante es como si no existieran.
Hola,
Quizá es una restricción de tu servidor y no puedes enviar más de 200 campos a la vez. Revisa si se puede ampliar en tu servidor.
Saludos
Hola buen dia
esta muy bien tu ejemplo me ayudo un poco con lo que quiero lograr hacer solo que aun no me queda claro como poder terminar mi caso,
yo tengo los checkbox a un lado de la informacion que tengo en mi base de datos y la quiero mandar a otra parte como un lista para imprimirla
como puedo hacer eso ??
Hola,
Para este tipo de ayudas que se salen de lo que hay en el blog y no tenemos una solución rápida debe enviar un mensaje desde el formulario de contacto con los máximos detalles posibles:
https://www.jose-aguilar.com/contacto/
Saludos
Hola que tal, muy bueno tu ejemplo, solo una pregunta cuando lo mando a imprimir en un PDF con la función FPDF no logro hacer que me de los saltos de linea de acuerdo al país seleccionado espero y me puedas ayudar
Hola, Este mensaje no se corresponde con este tutorial. Saludos
yo envio varios checkbox name=»countries[]» guardo en un campo como brasil,bolivia,peru,colombia ahora quiero con jquery recuperar de la tabla el campo guardado y con ese datos chekear los paises en un formulario
Es decir hacer un check en un formulario de todos los paises en el campo
Cual seria el codigoo te agradezco la colaboracion
Hola buenos días,
Para este tipo de ayudas que se salen de lo que hay en el blog debe enviarnos un ticket al centro de soporte y allí le indicaremos como podemos proceder:
https://www.jose-aguilar.com/soporte/
Saludos
Hola josé, Disculpa como podría hacer esto para que me pueda desplegar las opciones que tiene cada selección así como se hace en los combos dependientes
De ante mano muchas gracias por el aporte
¿y si el listado vieniera de una base de datos?
¿como podemos definir la variable en el POST si todavia no sabemos lo que listara el resultado de la base de datos?
Si vienen de la base de datos, no hará falta usar el post como el ejemplo. Deberás agarrar el array que retorne la query para procesarlo.
Hola! muy buen aporte muchas gracias :3
gracias funciono!!
Gracias, es lo que estaba buscando (Y)
Excelente, me funciona de maravilla
Hola, Gracias por compartir tus conocimientos, tengo una pregunta, un ejemplo si tengo dos checkbox y cada uno van a diferente campo es decir
Los países de EUROPA yo selecciono van a un campo de la tabla y los países de AMÉRICA se registran en otro campo de la misma tabla, como hago la inserción de estos, Espero me puedas contestar y dar un ejemplo. Te agradecería mucho…
Hola, Creo que tendrás que identificar los grupos por continentes por ejemplo. Tendrás que identificar los checkboxes por continentes definiendo su name y en el value el valor del país.
Por ejemplo:
…input type=»checkbox» name=»europa[]» value=»españa» …
…
…input type=»checkbox» name=»america[]» value=»brasil» …
Espero haberte ayudado,
saludos
yo tengo un problema, me gustaria saber si me puedes orientar en el tema, guiandome en tu ejemplo, el usuario dio clik en españa, eu, china y nigeria. supongamos que el mismo usuario vuelve a entrar, cual seria el codigo para que aperescan seleccionadas esas opciones, dando paso a que seleccione la que desee de las restantes. agradeceria mucho si me pudieras ayudar.
Hola,
Te puedo comentar una idea que yo plantearía. En el mismo formulario tiene que recibir en un array los paises seleccionados y hacer una comprobación en los inputs para checkearlos en el caso de que estén en el array comentado.
Espero haberte dado una idea,
saludos
Saludos
el ejemplo que tienes esta muy claro los checkbox ya los has definido y solo los controlas con el array, pero lo que te e comentado en la pregunta anterior es de poder controlar una serie de checkbox de manera dinamica.
A simple vista parece que tienes que recuperar de la base de datos cuales están checkeados y luego recorrer los checkboxes con un bucle e ir comparando si el valor, por ejemplo, España está guardado en la base de datos al input tendrás que añadirle un atributo extra para checkearlo –> checked=»checked»
Puedes ayudarme a hacer la solución que nos comentas? Muchas gracias
Hola, si, que problemas tienes?
Ola amigo oye esta interesante el articulo, pero mi duda es de que e tenido un problema al resolver un conjunto de checkbox pero mandados a traer desde mysql, implementar un ciclo while por que ahi se tienen que almacenar e imprimirlos en checkbox, cuando son demaciados se generan automaticamente dependiendo los datos de la base de datos asi que mi duda es como poder controlar los checkbox de esa forma.
gracias, me ayudo mucho en lo que estoy trabajando ya que no encontraba la solucion, gracias
Gracias me ha servido de mucho, tenia como media hora buscando como hacer esto. Y que fácil lo explicas
[…] un artículo anterior ya vimos como controlar un grupo de checkboxes guardados en un array con PHP. En este artículo vamos recoger los valores de un grupo de checkboxes con […]