HTML tiene un elemento SELECT
que permite el atributo multiple
para poder seleccionar más que una opción a la vez. (Las selecciones mútliples se hacen normalmente pulsando la tecla Control mientras se seleccionan las opciones con el ratón.) El atributo multiple
no tiene valor. Si no está, entonces el elemento SELECT
sólo permite seleccionar una opción. Este artículo explica como puedo obtener múltiples opciones seleccionadas en un programa PHP.
PHP devuelve los datos enviados desde un formulario en la variable «súperglobal» $_REQUEST. La variable $_REQUEST es una unión de las variables súperglobales $_GET, $_POST y $_COOKIE. Por lo tanto, su contenido no depende si hemos recibido los datos via un «GET» o un «POST». Es decir, es una buena opción en general.
La variable $_REQUEST es un array asociativo, donde los índices son los valores de los atributos id
o name
de los elementos de entrada en el formulario HTML enviado. A cada índice se asigna el contenido del elemento correspondiente. En un SELECT
simple se devolvería la opción seleccionada si hay.
Por ejemplo, consideramos el siguiente SELECT
de selección simple (nótese la ausencia del atributo multiple
):
<SELECT id="mi_select"> <OPTION value="hola mundo">Hola mundo</OPTION> </SELECT>
Si hubiéramos seleccionado la opción «Hola mundo», entonces, en PHP, la expressión $_REQUEST['mi_select']
tendría el valor 'hola mundo'
. (El valor del atributo value
del elemento OPTION
.)
Sin embargo, si el elemento SELECT
tuviera puesto el atributo multiple
, entonces sólo obtendríamos el valor de la última opción seleccionado. Para obtener todas las opciones, el valor de $_REQUEST['mi_select']
debería ser un array. Esto conseguimos cambiando el id
del elemento SELECT
a mi_select[]
. (Esto es el mismo nombre más los corchetes [].)
<SELECT id="mi_select[]" multiple> <OPTION value="hola mundo">Hola mundo</OPTION> </SELECT>
Este pequeño truco causa que $_REQUEST['mi_select']
es un array. Ahora puedo hacer un bucle sobre todas las opciones seleccionadas.
foreach ($_REQUEST['mi_select'] as $option_value) { // Haz algo con el valor de la opción seleccionada $option_value }
En corto: Asigna un nombre terminado en corchetes «[]» a un elemento SELECT
cuando tiene puesto el atributo multiple
para poder extraer todas las opciones seleccionadas desde PHP.
Referencias
- HTML 4.01 Specification
- El elemento SELECT de HTML
- La variable súperglobal de PHP $_REQUEST.
- PHP en Windows no funciona tras la instalación
12 comentarios
Comments feed for this article
5 febrero 2013 a 12:38
sareta
No me sirvió de mucha ayuda!
6 febrero 2013 a 19:28
trucosinformaticos
Lo siento. ¿Qué crees se debería cambiar en el artículo para que sea una ayuda mejor?
13 marzo 2013 a 02:38
camjoac
Hey, no está malo…para nada…sin embargo lo complementaria con el código inverso…donde se lee por ejemplo de una tabla los valores que tiene guardado y como marca la selección en el listbox
13 marzo 2013 a 18:08
trucosinformaticos
No estoy seguro lo que intentas hacer, pero sospecho que el «inverso» que buscas no existe.
Con PHP creas el HTML de las páginas. Así sabrás lo que habrá dentro de una tabla estática. La interacción del usuario dentro del navegador está controlada por JavaScript. En PHP no te enteras de cambios hasta que el usuario haya pulsado algún botón «submit». Entonces recibes el estado del momento como, por ejemplo, la opción seleccionada en un elemento SELECT.
Si quieres poner el estado inicial de un select, entonces la salida HTML de PHP debe fijarlo con el atributo «selected» en uno de los elementos OPTION reunidos en el elemento SELECT. (Ver https://developer.mozilla.org/de/docs/HTML/Element/select, por ejemplo.)
Desde un elemento TABLE no puedes recibir nada, ya que no es un elemento de entrada. Sólo puedes hacer una tabla de muchos elementos INPUT – que es como las bibliotecas javascript simulan una tabla editable.
Espero haberte aclarado tus dudas. Gracias por tu interés en mi página.
31 julio 2013 a 07:34
Walter
En su ejemplo obtendrá un error php, para que funcione y no dar error debería ser así:
$funciona_sin_error =$_POST[«mi_select»];
for ($i=0;$i<count($funciona_sin_error);$i++)
{
echo " Enviado » . $i . «: » . $funciona_sin_error[$i];
}
saludos
31 julio 2013 a 07:50
Walter
Usar $_REQUEST para tratar el recibo de un formulario no es aconsejable, por el tema Cross-Site Request Forgeries.
http://php.net/manual/es/security.globals.php
saludos!!
PD: me habia olvidado aclar eso!!
1 agosto 2013 a 12:50
trucosinformaticos
Gracias por la observación, Walter. Como ya hace tiempo que no utilizo PHP y no puedo comprobarlo, dejo mi artículo como está (como mi opinión de enconces) y recomiendo tu comentario como una actualización. (Me he permitido corregir una «n» en fuciona_sin_error.)
Creo es bueno reconsiderar el uso de $_POST y $_GET en lugar de $_REQUEST para filtrar la provenienca de los datos de entrada. Hará más difícil a atacantes a inyectar datos.
19 marzo 2020 a 12:12
Mr Lp3
Perfecto, mil gracias!!!
19 marzo 2020 a 17:41
trucosinformaticos
Me alegro – y gracias por el elogio.
31 enero 2024 a 22:06
lazaroysr96
Gracias, ésta publicación aclara mi duda, necesitaba saber esto por que quiero añadir la opción de que al crearce una entrada en el blog que estoy diseñando se puedan seleccionar varias categorías, lo siguiente que necesito saber es como guardar esta información, la perspectiva que tengo es almacenar los datos en json y luego guardar esta json en la base de datos.
1 febrero 2024 a 13:04
trucosinformaticos
Gracias por el cumplido. No sé una respuesta inmediata al problema, pero puedes considerar lo siguiente: El $_REQUEST[‘mi_select’] devuelve un array simple de strings. Este corresponde en JSON a una liste entre corchetes [«elemento 1», «elemento x»]. Esto se puede generar con funciones de String. Probablemente hay una función que convierte una variable en PHP a JSON directamente.
Guardar un JSON en una base de datos es otro tema. Esto depende de la base de datos, por ejemplo si es SQL o NoSQL. Tu problema es uno a que un sistema de inteligencia artificial, por ejemplo Co-Pilot o ChatGPT, probablemente puede darte una solución mientras puedes practicar usar estos sistemas.
30 marzo 2024 a 15:52
lazaroysr96
Gracias por la ayuda, no había vuelto por aquí, creo que me pasaré por tu blog un poco más a menudo, veo contenido bastante interesante y útil.