Campos de selección múltiple en PHP

Vamos a ver un forma simple de trabajar con campos de selección múltiple; es decir, que se puede seleccionar más de un valor a la vez. Para que quede mas claro vamos a ver un ejemplo completo, supongamos que tenemos el siguiente formulario:

index.html

   
Cuales son tus colores preferidos?
Rojo
Azul
Verde

Lo que vemos son 3 campos tipo checkbox llamados: color_rojo, color_azul y color_verde, típicamente recuperaríamos los valores de los campos de la siguiente forma:

proceso_colores.php

';
echo $azul  . '
'; echo $verde . '
'; //despues trabajamos con las variables normalmente... ?>

Esto es bueno siempre que nuestros campos sean independientes, pero que sucede cuando queremos seleccionar multiples valores ? tendriamos que recuperar en nuestro código PHP todas las variables… y si el campo es cargado dinámicamente? o si los valores posibles son variables?… todo esto genera sin dudas trabajo extra, dado que tendríamos que retocar el código cada vez que algo cambie.
Por suerte, existe una forma sencilla de trabajar con este tipo de campos; ahora veremos que cambios debemos hacer en nuestros archivos .

index.html

Cuales son tus colores preferidos?
Rojo
Azul
Verde

Nótese que cambiamos los nombres de los checkboxes y agregamos los paréntesis rectos [], ahora todos se llaman colores[], al hacer esto el intérprete de PHP almacena todos los valores chequeados en el array colores[] lo que nos permite hacer lo siguiente:

proceso_colores.php


El código anterior recupera la variable colores (que ahora es un array y tiene cargados los valores chequeados); luego usamos la función implode para generar una cadena de texto y poder mostrarla.

Ahora que sabemos como trabajar con este tipo de campos, vamos a ver un ejemplo donde generamos una cadena para usarla en una sentencia SQL

proceso_colores.php


Lo que hacemos es recuperar la variable e iterar sobre el array para poner en cada valor las comillas correspondientes; luego, guardamos las cadenas nuevamente en un array auxiliar y finalmente usamos la función implode para agregar las comas. La cadena generada se concatena en la sentencia INSERT y listo.

Podemos ver que es una técnica muy util ya que nos permite manejar este tipo de campos variables de forma simple. Además, hace nuestro código mas reusable ya que ahora no tenemos que cambiar nada en el caso que se agreguen mas valores.

Juan Benitez

Fundador de Tecnopedia.net. Licenciado en Informática, desarrollador Web, Android y PHP. Apasionado de las tecnologías y el fútbol. Reparto mis días programando, creando sitios, apps o escribiendo en @Tecnopedianet... y sí, además tengo esposa y una hija ;)

View all posts by Juan Benitez →

20 thoughts on “Campos de selección múltiple en PHP

  1. me gustaria saber del tema, pero en reslacion a una base de dato; ejemplo:
    yo estoy programando en php y necesito traerme una lista de un personal, pero que cada persona que me traiga tenga un checkbox asociado, cosa que cuando yo seleccione (mas de uno), este me traiga el nombre de la persona que seleciones;todo esto es por que tengo que actualizar los datos de esta persona, insertandoles un dato traido de in listbox que ya lo tengo, en resumidas cuentas lo que debo hacer es seleccionar por ejemplo 2 personas y un lugar en el listbox y que todo esto se acualice en la base de datos. gracias si me puede ayudar.

  2. Hola wilson, si entiendo bien tu consulta creo que la solución que buscas es similar a lo que dice en el artículo.
    El formulario seria casi igual solo que en vez de colores tendrías personas y la forma de recuperación de los datos seria igual también; la única variante que se presenta es en la sentencia SQL donde tendriamos un UPDATE en vez del INSERT, el truco esta en armar la sentencia convenientemente iterando el array de personas y creando una cadena como esta: («nombre_persona1», «nombre_persona2») para usarla en una sentencia similar a:
    UPDATE tbl_personas
    SET campo_modificado = «dato traido del listbox»
    WHERE persona IN («nombre_persona1», «nombre_persona2»)

    Espero haberte aclarado un poco tus dudas, sino es asi, no dudes en escribirme y con gusto puedo ayudarte un poco mas.

  3. hola mi pregunta capaz que es media desubicada te pido perdon por eso pero capaz puedas orientarme,estoy haciendo una pagina en la que quiero insertar un menu de seleccion similar al que se encuentran en las paginas de ventas de vehiculos de autos o motos ,,para seleccionar por ejemplo la marca ,,el modelo ,,el año y todo eso cuando le de al botn buscar me seleccione por ejemplo el vehiculo que busco ,,como podria hacerlo?perdon otra vez,y si me podes orientar te lo agradezco mucho,saludos.

  4. ¡Hola! Estoy intentando recuperar un checkbox con los procedimientos que se están señalando. Sin embargo, a mi me resulta imposible. Primero porque implode ya está en desuso, supongo.
    En segundo lugar, los problemas derivan de si se deja o no vacío el checkbox. Si tiene alguna casilla activada, no hay problemas, pero en caso de que el checkbox no sea obligatorio y no tenga seleccionado una casilla PHP da un warning.
    ¿Cómo solucionar ésto?
    Un saludo.

  5. Hola Vicente, bueno primero que nada la función implode no está en desuso, la documentación oficial no hace ninguna referencia con respecto a lo que tu mencionas (http://www.php.net/implode).

    Por otro lado, si tu checkbox no es obligatorio vas a tener que tomar las precauciones debidas, en el ejemplo no fue tomado en cuenta ese caso ya que no era el objetivo del articulo, pero deberias tener algo como esto:

    if (isset($_POST[‘colores’])){

    $colores = $_POST[‘colores’];
    //El resto del codigo va aqui….

    }

    Con esto evitas procesar la variable $colores si no fue seleccionada al menos una opción.
    Bueno espero que esto te ayude con tu problema.
    saludos

  6. Hola, buenas tardes, estoy realizando un formulario, que tiene una funcionalidad muy similar a la que explicas en el articulo pero tengo un par de inconvenientes, lo que estoy haciendo es que construyo checkbok, dependiendo a los valores que tenga en la base de datos,
    «.$rowmp[«descripcion»].»-«.$rowmp[«idcatmateriaprima»].», adicionalmente construyo un input text, pero tengo problemas en que el momento en cual seleccionen los productos mostrados en los checks correnpondan a los valores que esta colocando en el input. espero que me puedas ayudar.

  7. Hola, mi caso es el siguiente, tengo un checkbox que se llena de una base de datos:
    1 recupero en un array el campo deseado de mi base de datos
    2 con el uso de explode separo el texto de este array
    3 luego introduzco cada elemento del array en un checkbox
    4 por medio de tu codigo

    lo recupero pero despues lo intento meter a una tabla diferente y en lugar de poner el valor del array me pone el nombre mismo del array, alguna sugerencia?
    gracias de antemano

  8. hola
    por favor necesito hacer una evaluación dentro de un sitio web que se hizo con actiweb , pero tengo que hacer actividades y quiero hacer una test de selección múltiple con una única respuesta por favor ayudame con el código para subirlo a la pagina
    muchas gracias por tu valioso tiempo
    Esperanza

  9. estoy teniendo un problema con por falta de información
    mi problema es q no se como hago para hacer un cuestionario que tenga respuestas estilo idfes y que me valide las respuestas con una nota si son correctas o no porfis espero pronto una respuesta
    muchas gracias 🙂

  10. hola Esperanza, la verdad no conozco el sistema de actiweb, lamento no poder ayudarte con eso; pero si solo queres es una respuesta unica podes cambiar los checkbox por radiobuttons y con eso solo pueden seleccionar 1 opcion.

  11. Eliza,
    no entiendo bien la primera parte de tu pregunta,»respuestas estilo que ??» por otro lado, la validacion de las respuestas puedes implementarlas con javascript o php, depende del tipo de cuestionario que quieras hacer y el uso que le vayas a dar. Para ayudarte mejor preciso que me des un ejemplo de que tipo de cuestionario quieres hacer.
    saludos

  12. Hola buenas tardes, mi preguntas es la siguiente, como podria hacer una select anidado en php, que me filtre segun los select selecionados. Gracias por su ayuda

  13. Hola, esta muy bueno el ejemplo, pero podrias ayudarme con esto?
    te explico:

    al seleccionar multiples valores necesito que me de una unica respuesta, es decir, si le digo o selecciono, mi pelo es negro, mi piel es morena, mi estatura mediana, me responda con una unica respuesta como: tus rasgos sn sudamericanos…por ejemplo.
    O, mis curvas son alzadas, mis caderas son pequeñas, responda, tienes contextura media.

    Por favor, ayudame con esto. muchas gracias!

  14. Hola.
    buen tutorial pero me surgio una cuestion,
    por ejemplo,si deseo hacer una busqueda poniendo un campo para que ingrese el color a buscar, como hacer el query para que me traega los datos que se concatenaron?

  15. hola ….. mira tengo un problemita trato de mandar varios valorer(valga la redundancia) pero al mommento de enviarlos a otra pagina solo me manda un valor te pongo mi codigo

    ______________________________________

    No Articulo:

    Seleccione el # Articulo

    <?php
    $SQL="SELECT \"idArticulo\",descripcion FROM articulos order by \"idArticulo\" ";

    $resultado=EjecutarSQL($SQL,1);

    foreach($resultado as $array)
    {
    echo '’.$array[‘idArticulo’].’ – ‘.$array[‘descripcion’].»;
    }

    ?>

    ________________________________________________________

    $(document).ready(function() {

    $(‘#cmdAgregar’).click(function(event) {
    $(«#preloader1»).css(«display», «inline»);
    $.post(«altaactualizafacart.php»,
    {
    // var foo = $(‘#nofactura :selected’).map(function(){return $(this).val();}).get(),
    nofactura:$(«#nofactura option:selected»).val(),
    noarticulo:$(«#noarticulo option:selected»).val()
    },
    function(respuesta){
    $(«#preloader»).css(«display», «none»);
    $(«#contenido»).html(respuesta);
    });
    });
    });

    mi variable que manda varios valores es noarticulo pero solo manda uno no se si puedas ayudarme en este caso

  16. Hola!muy buen tu explicacion y aporte! pero implemente tu codigo pero me salio un error
    Parse error: syntax error, unexpected ‘)’, expecting T_PAAMAYIM_NEKUDOTAYIM 🙁

  17. saludos en mi formulario tengo checkbox lo hice cob su ejemplo pero al hacer insert a la base de dato postgresql me aparece un error me parece q espor el tipo de dato pero no se mi php

    if (isset($_POST[‘misiones’])){

    $misiones = $_POST[‘misiones’];

    foreach($misiones as $mision){
    $valor = «‘».$mision.»‘»;
    $misiones_aux[] = $valor;
    }
    $valores = implode(‘, ‘, $misiones_aux);
    $sql_valores = «(» .$valores. «)»;
    }

    try {

    $q = «INSERT INTO censo_socioeconomico.familias «;
    $q.= «(estatus,id_comunidad,naci,cedula,genero,cne,nombre,apellido,fecha, edocivil, direcion, telf_habit, telf_cel, correo, nivel_instruccion, profesion, situacion_ocupacional, ingreso, mensual, misiones) «;
    $q.= «VALUES «;
    $q.= «(‘$estatus’,’$id_comunidad’,’$naci’,’$cedula’,’$genero’,’$cne’,’$nombres’,’$apellidos’,’$fecha’,’$edocivil’, ‘$direccion’,’$telf_habit’, ‘$telf_cel’, ‘$correo’, ‘$nivel_instruccion’, ‘$profesion’, ‘$situacion_ocupacional’, ‘$ingreso’, ‘$mensual’, » . $sql_valores. «; )»;
    die($q);

    if($conn->Execute($q)){
    $q = «SELECT max(id) AS id FROM censo_socioeconomico.familias WHERE id_comunidad=$id_comunidad «;
    //die($q);
    $r = $conn->Execute($q);
    $id_familias=getLastId($conn, ‘cedula’, ‘censo_socioeconomico.familias’);
    $this->Beneficiarios($conn,$id_familias,$beneficiario);
    //die($id_familias);
    return 1;
    }else{
    return 2;
    }

    }
    catch( ADODB_Exception $e ){
    if($e->getCode()==-1)
    return ERROR_CATCH_VFK;
    elseif($e->getCode()==-5)
    return ERROR_CATCH_VUK;
    else
    return ERROR_CATCH_GENERICO;
    }
    }
    mi tabla postgresql

    CREATE TABLE censo_socioeconomico.familias
    (
    id serial NOT NULL,
    id_comunidad character(1),
    estatus character(1),
    naci integer,
    cedula integer NOT NULL,
    nombre character varying,
    apellido character varying,
    fecha date,
    edocivil character(1),
    genero character(1),
    direcion character varying(500),
    telf_cel character varying,
    telf_habit character varying,
    correo character varying NOT NULL,
    twiter character varying,
    nivel_instruccion character(1),
    profesion character(1),
    situacion_ocupacional character(1),
    cne character(1),
    ingreso character varying,
    mensual numeric(40,2),
    misiones boolean[],
    CONSTRAINT id PRIMARY KEY (id),
    CONSTRAINT ced UNIQUE (cedula)
    )
    WITH (
    OIDS=FALSE
    );
    ALTER TABLE censo_socioeconomico.familias
    OWNER TO puser;

    mi error
    INSERT INTO censo_socioeconomico.familias (estatus,id_comunidad,naci,cedula,genero,cne,nombre,apellido
    ,fecha, edocivil, direcion, telf_habit, telf_cel, correo, nivel_instruccion, profesion, situacion_ocupacional
    , ingreso, mensual, misiones) VALUES (‘0′,’1′,’1′,’1′,’0′,’1′,’DDDDDDD’,’DDDDDDD’,»
    , ‘0’,», », », », ’55’, ‘666’, ‘@’, ‘1’, (‘1’, ‘2’, ») )

    ERROR: INSERT has more target columns than expressions x favoe ayudenme de antemano gracias

Comments are closed.