Selects dependientes

Tengo un select principal y otro secundario. Me gustaría saber si hay posibilidad desde PHP que al seleccionar un valor del primer select, en el segundo se carguen los que estén asociados a ese valor del primer select.
Las tablas están en mysql y relacionadas de varios a varios. Relaciono Facultad con departamento.
Una facultad tiene muchos departamentos, pero un departamento puede pertenecer a varias facultades.
La tabla resultante que guarda las claves principales de ambas tablas en una tercera es la que tiene la relación muchos a muchos.
La duda la tengo de qué forma hago para que al seleccionar del primer select un valor, me cargue en el segundo los que estén relacionados pero que me muestre la descripción para los departamentos (obtenido desde la tabla departamento).
Tengo las tablas:
tabla_facultad
tabla_departamento
Tabla_fxd (facultad por departamento)

1 Respuesta

Respuesta
1
Lo más sencillo es que pongas un evento onchange en el campo de la primera select para que envíe el formulario. Una vez enviado, puedes realizar la consulta a tus tablas y rehacer la página con toda la información necesaria.
Ok. Hasta ahí bien, en el select principal pongo el evento onchange que apunte a una función javascript para que recargue el segundo select.
La duda la tengo en que al tomar los datos de la tercera tabla (tabla facultad_x_departamento) solo tengo los campos clave y me gustaría seleccionar de la tabla departamento la descripción asociada a esa tabla.
Según llego a entender, hay una instrucción en sql que se llama inner_join o algo así para poder seleccionar un campo de otra tabla que esté en la primera (o algo así entiendo), pero no logro llegar a comprender esto y he buscado información de inner_join pero no consigo que funcione.
Básicamente lo que quiero es: selecciona de la tabla (facultad_x_departamento) todos los campos ID clave que estén asociados a los campos clave ID de la tabla facultad (es la principal) adjuntando el campo descripción de la tabla "departamento" que esté asociado al campo ID clave obtenido.
Espero se comprenda bien lo que deseo y es lo que me tiene parado sin poder progresar.
Por cierto, gracias David por tu pronta respuesta.
Un saludo
En efecto, la consulta que requieres precisa del uso de INNER JOIN. Con esta sintaxis puedes solicitar campos de más de una tabla que esté relacionada con la primera.
Básicamente, si tienes por ejemplo:
Tabla1 (
id_facultad,
nombre_facultad)
tabla2 (
id_departamento,
nombre_departamento)
Tabla3 (
Facultad,
departamento)
Siendo la tercera tabla la que expresa la relación muchos a muchos de las dos primeras, la consulta sería:
SELECT * FROM tabla1 t1 INNER JOIN tabla3 t3 ON t3.facultad=t1.id_facultad INNER JOIN tabla2 t2 ON t3.departamento=t2.id_departamento
Si no te aclaras, puedes encontrar más información en el manual de MySQL:
http://dev.mysql.com/doc/refman/5.0/es/join.html
Buenos días David,
Conseguir obtener con Inner Join el resultado que esperaba.
Lo último que ya me queda y que no ha sido posible que salga es el paso de recargar el segundo select a partir de la selección del primer select desde javascript.
Los datos los tengo correctamente cargados en la consulta SQL y con mysql_query($sql, $conn); obtengo los registros correctos tal y como yo quería, pero no se de qué forma pasarle esos registros a la función javascript para que realice el bucle correspondiente y me recargue el segundo select.
El código del primer select es este (en su evento onchange)
onChange="cargar_dptos(this.options.selectedIndex, <?php echo $numfac; ?>, <?php echo $numdpt; ?>)">
Llamo a la función cargar_dptos y le paso el indice seleccionado del primer select y con $numfac les paso el total registros del primer select (para poder generar un bucle y crear tantos arrays como registros tiene) y $numdpt para lo mismo pero con el segundo select.
El problema está que no logro obtener una función correcta en javascript que me recargue ese segundo select.
¿Me puedes aportar alguna idea? Desconozco totalmente javascript en su forma de actuar y obtener datos de php.
La función javascript que tengo es esta:
<script>
function cargar_dptos(codigofacultad, numregfacultad, numregdepart){
    var grupo=new Array(numregfacultad)
    //Crea tantos arrays como valores hay en el combo principal
    for (i=0; i<numregfacultad; i++) grupo = new Array()
}
</script>
Un saludo y gracias de antemano.
Rafa.
Lo que intentas hacer no puede hacerse de esta manera.
Tienes dos opciones. La complicada es usar AJAX para hacer que se actualicen los datos en la forma que estabas intentando. Pero esta tecnología no es simple si no la conoces y requiere un esfuerzo extra de programación.
Te recomiendo la opción sencilla: que el onchange envíe el formulario. Entonces recibes el dato de la primera select, averiguas el resto de datos y rehaces la página con todo ello.
Buenas noches David,
Ante todo darte sinceramente la gracias por tu rápida respuesta y por el interés mostrado en intentar ayudarme.
Ya me temía que estaba tomando el camino difícil. AJAX no lo he utilizado nunca y por tanto, sería más complicado de hacer.
Según entiendo por el camino fácil, en en evento onchange llamo a otra página PHP y le paso por URL el valor seleccionado del primer select. A partir de ahí, realizo el bucle necesario para recargar el segundo select y con header redirecciono nuevamente a la página PHP original y supuestamente ya deberá estar relleno el segundo select.
No se si esto se podrá hacer o tampoco. De todas formas voy a intentarlo y si tienes alguna idea sobre este tema, agradezco de antemano me lo indiques para no estar otros cuantos días más sin poder llegar a lograr esto por no poderse.
Un saludo y nuevamente gracias por tu ayuda prestada.
Atentamente. Rafael
En efecto esta es la idea. Aunque la página a la que lo envías puede ser la misma. Suele ser más práctico: al principio de la página 'detectas' si tienes un valor que viene de la select y actúas en consecuencia.
Buenos días David,
Ok, entonces lo que hago es en el evento onchange poner el nombre de la misma página.php y por ejemplo con un valor que le paso por parámetro con el indice del primer select ya sabría si he seleccionado algo o no. En caso de que no seleccione nada, aparecerá vacío y si ese valor pasado por url tiene algún índice, que realice un bucle con una SQL (que ya la tengo realizada con inner join) para que cargue todos los datos correspondientes en el segundo select.
Ya me has encaminado correctamente por el buen camino :-)
No obstante una vez lo termine te comento que tal ha ido todo porque lo veo demasiado fácil como para que salga a la primera.
Saludos cordiales,
Atentamente. Rafael
Exacto, ese es el camino. Y tranqui que seguro que sale :-)
Buenas tardes David,
He estado haciendo las modificaciones oportunas y me surge una duda:
En el evento onChange del primer select tengo puesto esto:
pagina.php?ctrl= aqui quiero pasarle el valor del indice seleccionado del primer select

De tal forma que al recargar la página con ese valor pasado por url, puedo aplicarlo en la siguiente SQL:
$sql = "SELECT t_facultad.*, t_facultad_x_departamento.*, t_departamentos_facultad.* FROM t_facultad_x_departamento INNER JOIN t_departamentos_facultad ON t_facultad_x_departamento.iddpto = t_departamentos_facultad.iddpto WHERE t_facultad.idfacultad = $_GET["ctrl"]".
De esa forma obtendré una SQL con todos los registros anexando la descripción (con inner join) pero solo de los registros cuyo campo idfacultad coincida con el que he obtenido por el método GET. (Al menos así lo entiendo)
La duda la tengo en qué forma le puedo pasar el valor seleccionado del primer select elegida para enviarla en el evento onChange o dicho de otra forma, cuando seleccione un valor en el primer select, ¿Hay alguna forma de pasarle ese valor en su evento onchange para que al recargar la página lo tenga disponible y poder realizar la SQL del segundo select?
Gracias y saludos
Atentamente. Rafael
Es mucho más sencillo que esto.
El onchange sólo debe enviar el formulario. Cuando lo recibas, te encontrarás el valor de la select en el array correspondiente. Por ejemplo:
<form name="tuform" method="post" action="tupagina.php">
<select name="primeraselect" onchange="tuform.submit()">
<option>Tuopcion</option>
<option>OtraOpcion</option>
</select>
</form>
Recibirás el valor de la select en $_POST["primeraselect"] cuando cambies la selección de la lista.
Hola David,
Por fin está conseguido y todo gracias a tu ayuda y gran labor.
Le agradezco sinceramente las molestias que se ha tomado para ayudarme en la solución de este código.
Un saludo y que tenga buen día.
Atentamente. Rafael

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas