Recoger datos de un Select Múltiple con PHP

20 de julio de 2004
Valoración del artículo:
Este script enseña la técnica necesaria para acceder a los elementos seleccionados de un select múltiple.
Quizá un problema que se nos puede plantear durante el trabajo con PHP, es querer recoger los datos de un Select Múltiple. Recordamos que un select múltiple es un campo de formulario donde se pueden seleccionar varios elementos a la vez.

Nota: Para seleccionar varios elementos de un campo select múltiple, tenemos que utilizar el botón de "control" e ir pulsando cada uno de los elementos que deseamos seleccionar. Es importante que este punto quede claro para los visitantes de vuestras páginas, ya que es muy habitual que los usuarios no sepan manejar este tipo de campos.

Para ver mejor lo que deseamos hacer, es muy interesante entrar la página que contiene el ejemplo en funcionamiento. Para continuar, echemos un vistazo al siguiente ejemplo...

<form action="trataformulario.php" method="POST">   
Nombre: <input type="text" name="nombre"><br>   
Apellidos: <input type="text" name="apellidos"><br>   
Email: <input type="text" name="email"> <br>   
Cerveza: <br>   
<select multiple name="cerveza">    
<option value="SanMiguel">San Miguel</option>    
<option value="Mahou">Mahou</option>    
<option value="Heineken">Heineken</option>    
<option value="Carlsberg">Carlsberg</option>    
<option value="Aguila">Aguila</option>   
...   
</select><br>   
<input type="submit" value="Enviar datos!" >
</form>


Tenemos este formulario en nuestra página y queremos recoger los datos introducidos por el usuario. Para los campos "nombre", "apellidos" y "email" no tenemos ningún tipo de problema, recogemos los datos por el método habitual, es decir:

<?php
echo "Nombre: ". $_POST["nombre"];
echo "<br>Apellidos: ". $_POST["apellidos"];
echo "<br>E-mail: ". $_POST ["email"];
?>


Uno se podría preguntar, y porque no puedo poner "$cerveza=$_POST["cerveza"]"? el problema reside en que los option del select múltiple tienen todos el mismo nombre y en caso de tener varios elementos seleccionados sólo obtendríamos el último elementoº. Y como resolver esto? Pues bien, la solución es bien sencilla. Basta con poner en el final del nombre del campo del select múltiple unos corchetes ([]), en nuestro caso sería "cerveza[]". De este modo PHP interpreta el campo en cuestión como un array con tantas posiciones como elementos haya seleccionados en el select múltiple. Veamos pues como quedaría nuestro ejemplo...

<form action="trataformulario.php" method="POST">   
Nombre: <input type="text" name="nombre"><br>   
Apellidos: <input type="text" name="apellidos"><br>   
Email: <input type="text" name="email"> <br>   
Cerveza: <br>   
<select multiple name="cerveza[]">    
<option value="SanMiguel">San Miguel</option>    
<option value="Mahou">Mahou</option>    
<option value="Heineken">Heineken</option>    
<option value="Carlsberg">Carlsberg</option>    
<option value="Aguila">Aguila</option>   
...   
</select><br>   
<input type="submit" value="Enviar datos!" >
</form>


Y para recoger la información y tratarla actuaríamos del siguiente modo...

<?php
echo "Nombre: ". $_POST["nombre"];
echo "<br>Apellidos: ". $_POST["apellidos"];
echo "<br>E-mail: ". $_POST ["email"];
$cervezas=$_POST["cerveza"];

//recorremos el array de cervezas seleccionadas. No olvidarse q la primera posición de un array es la 0

for ($i=0;$i<count($cervezas);$i++)    
{     
echo "<br> Cerveza " . $i . ": " . $cervezas[$i];    
}
?>


Nota: Al ponerle este tipo de nombres (terminando en corchete) a un campo de un formulario y si usamos funciones Javascript para validarlos, manejarlos, etc... debemos añadir a dicho campo, además del nombre, el atributo de HTML id y utilizar este último como identificador del campo, en vez del nombre que se haya colocado en el atributo name, puesto que daría problemas.

El código completo de este ejemplo podría ser el siguiente. Sería bueno fijarse que hemos colocado todo el código en un archivo PHP. Ese código tiene un formulario reentrante, es decir, la página se llama a si misma para procesar el formulario. Recordar que puede verse este ejemplo en funcionamiento en una página aparte.

<?
if (!$_POST){
?>
<form action="select_multiple.php" method="POST">
    Nombre: <input type="text" name="nombre"><br>
    Apellidos: <input type="text" name="apellidos"><br>
    Email: <input type="text" name="email"> <br>
    Cerveza: <br>
    <select multiple name="cerveza[]">
       <option value="SanMiguel">San Miguel</option>
       <option value="Mahou">Mahou</option>
       <option value="Heineken">Heineken</option>
       <option value="Carlsberg">Carlsberg</option>
       <option value="Aguila">Aguila</option>
    </select><br>
    <input type="submit" value="Enviar datos!" >
</form>
<?
}else{

    echo "Nombre: ". $_POST["nombre"];
    echo "<br>Apellidos: ". $_POST["apellidos"];
    echo "<br>E-mail: ". $_POST ["email"];
    $cervezas=$_POST["cerveza"];

    //recorremos el array de cervezas seleccionadas. No olvidarse q la primera posición de un array es la 0

    for ($i=0;$i<count($cervezas);$i++)
       {
       echo "<br> Cerveza " . $i . ": " . $cervezas[$i];
       }

   }
?>

Compartir en redes sociales

Comentarios
Fueron enviados 21 comentarios al artículo
8 comentarios no revisados
13 comentarios revisados:
Por: Azteck11
25/8/2005
En verdad muchas Gracias, lo use con checkbox y de lujo no puedo pedir mas, me soluciono el problema que tenia pues me estaba volviendo loco.

Mil Gracias por este articulo.
Por: Jonathan
06/2/2009
Excelente justo lo que necesitaba
Muchas gracias
Por: quinqui
22/4/2009
Siempre había solucionado este problema usando un campo hidden y una función Javascript que lo llenaba al hacer Submit, con todos los valores seleccionados del Select, concatenados con punto y coma, aunque había leído de que se podía hacer directo con PHP pero como nunca me daba resultado, les doy las gracias por este ejemplo, porque no podía ser más sencillo que esto ^_^ Muchas gracias otra vez!
recoger datos de un select
Por: megara
24/7/2009
buen ejemplo.. la mitad de mi problema... ejemplo tengo que seleccionar con un query de mysql otro dato a partir de la cerveza seleccionada... pierdo el valor de cerveza cuando hago el siguiente select... podra alguien ayudar?
GRACIAS
Por: Guardián
03/9/2009
Gracias, por tu aporte pude lograr superar el inconveniente de insertar datos cruzados de un array en una tabla diferente a la especificada para el form principal, y de paso delimitar que array recoger excluyendo los vacíos.

Excelente aporte.
extraordinario aporte
18/2/2010
muchas gracias, antes resolvía el problema de una manera mucho mas compleja y ahora de esta forma ahorra mucho tiempo y deja el código mucho mas sencillo de entender.
GRACIAS!!!!!
Validar select múltiple
Por: venom_mau
08/3/2010
Y para validar ese select junto con Javascript, como sería?
Tuto
Por: Matias
21/3/2010
Que groso!!! es lo mas sencillo que encontre, muy buen aporte !!
Ingenioso y eficaz
Por: Alfonso
21/4/2010
Muchísimas gracias por la información. Años después de su publicación, sigue teniendo valor. Y es que no encuentro documentada esa forma de leer los select múltiples pero la solución adoptada funciona.
Muy bien por advertir que el ID del campo no sea igual al NAME en este caso, para evitar problemas de identificación del elemento en el DOM.
MIL GRACIAS
Y que sucede cuando tienes varios select?
Por: slishall
06/5/2010
Buenas tardes a todos, me explico. Yo realizo una consulta a una base de datos y muestro los resultados de la consulta por filas, y al lado de cada fila saco un select con las opciones SI y NO para eliminar o no el registro de la base de datos (pongo el código):

echo "<form action="../vendedor/admin_acciones.php?accion=borraO" method=post> ";
$result = mysql_db_query($this->basedatos, "select * from $nombretabla", $this->link) or $this->Error_mysql2(__FILE__, __LINE__);

echo "<table border="1"> ";
echo "<tr> ";
for($i = 0; $i < mysql_num_fields($result); $i++)
{
printf("<td><b>%s</b></td>", mysql_field_name($result, $i));
}
echo "</tr> ";

$borrado = "<select name='baja[]'>
<option selected>NO</option> <option>SI</option>
</select>";

while ($row = mysql_fetch_array($result))
{
echo "<tr> ";
for($i = 0; $i< mysql_num_fields($result); $i++)
{
printf("<td>%s</td>", $row[$i]);
}
printf("<td>%s</td>",$borrado);
echo "</tr> ";
echo "</tr> ";
}
echo "</table> ";
echo "<td> <input type='submit' name='Actualizar' value='Actualizar'/></td> ";
}

La pregunta es...cómo puedo recoger en una variable cada una de las decisiones tomadas para poder actuar luego en consecuencia en el script correspondiente?
Había pensado en un vector o algo similar pero ni idea?
Alguna ayuda?

Muchas gracias por todo
Un saludo
Roberto
Muchas Gracias
Por: Juan
24/5/2010
Mil gracias por este POST tenía un problema para manejar un dual listbox múltiple con JQUERY y pasar los valores a PHP y esto me lo ha solucionado.

carmen_...
introducir los datos a la bd mysql
27/12/2010
Gracias por el artículo. Cómo se hace para introducir los datos a mysql, una vez recogidos los datos del select múltiple? y... qué tipo de dato debería ser el de la base de datos? ENUM? SET? Ando algo liada con esto, me pueden ayudar?

poncian...
como le aria para que la selecion fuera para correos
04/5/2013
Saludos.
yo tengo un problmea con un formulario parecido.
requiro que un formulario de contacto mande el correo a un destinatario a escojer de la seleccion.
como le haria....
porfavor ayuudenme....
soy novato en esto d ephp

Manuales relacionados
Categorias relacionadas
El autor
José Lorenzo Escudero
Traductor y desarrollador de CriarWeb.com
http://www.criarweb.com


Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Donaciones
Si piensas que te hemos ayudado y merecemos tu apoyo económico...