> Manuales > Taller de PHP

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]; 
      	} 

   } 
?>

José Lorenzo Escudero

Traductor y desarrollador de CriarWeb.com

Manual