Los valores de
SELECT MULTIPLE
En una opción
SELECT MULTIPLE dentro de un
form típico de HTML es posible elegir
ninguno,
uno o
varios de los elementos de de la lista.
Basta con
pulsar con el
mouse (
... has visto que fino quedó... lo de mouse..) en los valores
valores elegidos manteniendo pulsada la tecla
Ctrl, es decir... puro
Windows
Para recoger los valores de esa opción se define -dentro de la etiqueta SELECT- un
name tipo
array. Bastaría con escribir:
<SELECT MULTIPLE
name=var[] SIZE=6>
Como ves
var es el nombre de la variable (esta vez sin
$ delante, recuerda que no estamos en PHP sino en puro HTML) y va
seguido de
[] precisamente para indicar que es un
array.
Lo de
SIZE=6 no es otra cosa que el
parámetro que indica cuantos elementos de la lista de opciones queremos que se visualicen simultáneamente en la página.
El
truco está en los
values de cada
option dentro de ese
select
Los he escrito así:
<option value=
1>Castellano
<option value=
2>Francés
<option value=
4>Inglés
<option value=
8>Alemán
<option value=
16>Búlgaro
<option value=
32>Chino
¡¡Fíjate que he mantenido
exactamente el mismo
orden que he definido el campo
SET de la tabla.
Y fíjate también en los valores:
1,
2,
4,
8,
16 y
32 que son precisamente
las potencias de 2:
20,
21,
22,
23,
24,
25, y
26
Si eres de
ciencias seguro que ya no vas a necesitar más comentarios, pero
si eres de letras como yo... quizá te venga bien
la explicación con adaptación curricular muy significativa que tuvo que darme el
amigo que me enseño el
truco...
¿Pensaste que era mía la idea?. Pues...
no.. así es la vida
El caso es que al seleccionar valores, van añadiéndose al
array. Por ejemplo. Si selecciono:
Francés y
Búlgaro el array sería este:
var[0]=2,
var[1]=16
Si sumamos esos valores (
2 +
16) nos daría
18 (
hasta ahí llegamos hasta los de letras... :-) ..) y si convertimos a
binario el
dieciocho resultará:
010010
que es como decirle a MySQL (mirando la cadena de derecha a izquierda,
¿lo recuerdas?) que incluya el
segundo (Francés) y el
quinto (Búlgaro) que son las posiciones que tienen un
uno en la cadena.
Como ves,
un milagro de las matemáticas...
Creación del formulario
El caso más frecuente -casi el único- es que los registros de una tabla se añadan utilizando un formulario y
enviando desde él los datos a un
script PHP que ejecute la opción de añadir.
Si no recuerdas el funcionamiento de este método,
pulsa aquí...
de nada :-)
En el ejemplo he desarrollado un formulario -para añadir registros a la tabla
demo4- con las siguientes peculiaridades:
- Para los campos DNI, nombre y apellidos he utilizado input tipo texto y he recogido mediante la opción name cada uno de los campos en una variable independiente.
- Para los campos Fecha de nacimiento y hora de nacimiento he utilizado tres opciones select para cada una de ellas.
La finalidad de estas opciones no es otra que impedir la introducción de fechas no válidas (en realidad no lo impido totalmente ya que tal como está confeccionado podría introducirse dias 31 de febrero, o 31 de abril). Ese aspecto es mejorable... :-) pero... te dejo a tí la iniciativa de hacerlo... (... ¿has visto el viejo recurso dialéctico que utilizo para suplir mi ignorancia? ... :-)
- Los valores de esos tres campos (tanto en fecha como en hora) los recojo en variables que son elementos de dos array escalares.
- El campo sexo la recojo en en input tipo radio y les asigno valores M ó F que coinciden con los valores del campo ENUM de la tabla.
- Con el campo Fumador -opción Fumador/No fumador - hago exactamente lo mismo, pero asignándoles valores 1 ó 0 ya que el formulario no permite la opción NULL ó cadena vacia.
En el script posterior será cuando modifique los valores de esas variables.
- Para el campo Idiomas utilizo una opción select de tipo múltiple y para los values un pequeño truco que tienes descrito aquí la izquierda.
Pues bien, aquí
código fuente del formulario que he diseñado
Inserción de datos
Como recordarás, cuando se
envía el contenido de un
formulario mediante el
method=POST y se indica como
action un
fichero PHP los valores enviados son recogidos -en este último fichero- en
variables de PHP que
tienen exactamente el mismo nombre que los
name del formulario (esta vez con el
$ delante y cuyo valor coincide con los
values recibidos.
A partir de ahí, bastaría con
depurar los valores recibos,
recoger en variables los valores
depurados y
pasarlos a una
sentencia MySQL -de las que hemos visto en la página anterior- para que sean añadidas a la tabla correspondiente.
Yo lo he hecho tal como puedes ver aquí:
En realidad, tal como habrás podido ver -si es que has mirado el código fuente- la depuración ha sido la siguiente:
- He creado un valor de fecha y hora en formatos MySQL válidos de la forma que te describí un poco más arriba.
- He sumado todos los valores numéricos recibidos en el array obtenido del SELECT MULTIPLE y ese es el valor que he asiganado a la variable depurada que recoge el valor a escribir en el campo Idiomas.
La justificación de esa suma la tienes al margen... :-)
- La variable Fumador es la que tiene un poquito más de complicación. Veamos si logro explicarme bien.
Los valores que recibo del formulario son 1 ó 0 y tengo que transformarlos en una cadena vacía o en NULL.
Escribo un operador condicional (un if... else) para que se asignen a la variable uno de estos valores: $var="'\N'" (comilla doble, comilla simple, barra invertida, N, comilla simple y comilla doble) ó $var="''" (comillas dobles, dos comillas simples y unas comillas dobles)
- Con esos valores asignados... he tenido que recurrir a otro truco para que me funcione el invento. Seguramente hay un método más fino... pero como no lo conozco tienes dos opciones: o lo buscas en otra parte y luego me lo cuentas... o ... te conformas con mi chapucilla.. :-)
- Te habia comentando en páginas anteriores que en la sentencia INSERT los nombres de las variables no numéricas que contienen los values había que escribirlos dentro de comillas simples, pero con el caso este del famoso caso de campo tipo CHAR(0) haz una excepción. No metas entre comillas el nombre de esta variable. Me sospecho que haciendo esto, lo que ocurre es que escribe en la cadena de la sentencia de inserción uno de estos valores: ='\N' ó ='\N' (son los valores asignados a la variable sin las comillas exteriores que señalaban que el contenido era tipo cadena y ... como el nombre de la variable no va entrecomillado será exactamente eso lo que escriba.
Sigo sospechándome que si hubiéramos puesto el nombre de esa variable entre comillas lo que ocurriría es que se repetirían dos comillas seguidas (la que encierra la variable y la primera de una de estas cadenas) y por eso genera el error... pero te advierto... solo es una presunción...
Es evidente que con el asunto de los campos tipo
CHAR(0) me he
metido en un sembrado.. y bien por mi
ignorancia y
bisoñez manifiestas, públicas y notorias; o bien porque
la complejidad de manejo de ese tipo de campos; o tal vez por ambas, el caso es que...
te juro y no te miento... que no voy a volver a usarlos.
Cuando necesite un campo
booleano lo definiré como tipo ENUM con opciones Si y No... y problema resuelto...
Tu, desde luego, eres libre de la hacer lo que quieras... faltaría más... :-)