Combos Dependientes con php y mysql

Describo mi siguiente interrogante:
1-. Tengo Dos Combos en el combo 1 debo llenarlo con la tabla llamada fase, cuyos campos son id, nombre. El combo 2 debo llenarlo con la Tabla subfases, que tiene los siguientes campos subf_id, subf_nombre y subf_Fase (este es el campo por donde me relaciona con la tabla fase.
2-. El combo 2 se debe llenar dependiendo de la fase que se seleccione, depende de las subfases dependen de la fase.
3-. ¿Cómo lo HAgo sin hacer un submit?.

2 respuestas

Respuesta
1
"sin hacer un submit" a mi entender sólo te deja dos posibilidades:
1) Usar AJAX para realizar la consulta de la segunda combo en cuanto cambie la primera. Si conoces AJAX es buena solución. Si no conoces AJAX puede ser un poco complicado.
2) Usar Javascript para llenar la combo 2 en cuanto cambie la combo 1. Esto implica haber cargado antes toda la información en la página y puede servir en el caso de que las posibilidades no sean muchas, sino la información a cargar es muy grande y haría que la página tardase mucho en cargarse. El sistema consiste en cargar toda la tabla de todas las opciones de la combo2 como un array de Javascript. Al cambiar la combo 1, se selecciona del array las que corresponden y se introducen en el combo 2.
La Opción 2 no me sirve porque tanto el combo 1 como el combo 2 son dinámicos y están relacionados a una base de datos y no puedo cargarlos manualmente a un arreglo.
La Opción uno conseguí unos ejemplos con Ajaz, pero pensé que se podía hacer por otra manera sin necesidad de usar ajax...
Pues no hay muchas más opciones: si los datos están en una base de datos, habrá que leerlos de alguna manera.
Lo que no entiendo es porqué no quieres hacer el submit. ¿No te serviría que al seleccionar en la primera combo, se enviase automáticamente el formulario y llenase la segunda combo?
¿Bueno es que son varias campos que debo llenar... No se pierderan los valores cuando mande el submit?
Pues no, para nada vas a perder los campos.
En estos casos se suele hacer un submit a la misma página.
Al principio de la página, se comprueba si hay datos provenientes del formulario y se actúa con ellos según el caso.
Por ejemplo, al enviar la primera combo (y el resto de datos), se leería de la base de datos las opciones de la segunda combo.
El resto de campos se vuelven a rellenar con sus valores, por ejemplo:
<input type="text" name="nombre" value="<?php echo $_POST['nombre'] ?>">
La primera vez, $_POST["nombre"] no vale nada y por lo tanto, la casilla aparece vacía. La segunda vez vuelve a aparecer lo que hubiera escrito el usuario.
Saludos David, te explico, tengo una tabla donde aparecerán en una Tabla con n filas, dependiendo del numero de subfases que desee cargar el usuario, el primnero nindicara el numero de subfases a cargar, automáticamente cuando el indica el numero de subfases a cargar el genera una tabla con el número de filas que le indica el usuario, ese numero de fila tiene en una columna las FAses y en la columna del lado tiene las subfases, ambas son unos combos. LO que debo hacer es cuando seleccione una fase le muerte en la subfase que tiene al lado solo las que le pertenecen a esa fase y asiu sucesivamente. Este es el código que he generado:
<?
if($c2<=0)
{
?>
<form name="busqueda" action="?ac">
<table align="center" width="915" border="0" >
<tr>
<td width="222" align="center"><input type="hidden" name="pro_clav" value=" <? echo $a; ?>" ></td>
<td></td>
<td></td>
<td width="196"></td>
<td width="214"></td>
</tr>
<tr>
<td width="222" align="left">
<div align="left" class="Estilo8">Introduzca el Número de Subfases: </div>
</td>
<td width="163" align="center"><input type="text" name="nu" > </td>
<td width="94" align="center"><input type="submit" name="buscar" value="Cargar"></td>
<td></td>
<td></td>
</tr>
</table>
</form>
<?
if($nu!="")
{
?>
<form name="registro_e" method="post" action="">
<table align="center" border="1" cellpadding="5" >
<tr >
<td colspan="5" ><span class="Estilo8">Información de las Fases y Subfases a Cargar</span></td>
</tr>
<tr >
<td width="240" align="left" ><span class="Estilo8">Nombre de la Fase </span></td>
<td width="240" align="left" ><span class="Estilo8">Nombre de la Subfase </span></td>
<td width="130" align="left" ><span class="Estilo8">Comienzo </span></td>
<td width="130" align="left" ><span class="Estilo8">Fin </span></td>
<td width="100" align="right"><span class="Estilo8">Porcentaje (%)</span></td>
</tr>
<?
for($i=1;$i<=$nu;$i++)
{
$fa="SELECT * FROM oplk_mi_fases ORDER BY fas_id ASC ";
$fe=$db->ejecutar_sql($fa);
$fi=mysql_num_rows($fe);
?>
<tr>
<td width="240" align="left"> <span class="Estilo8">
<select id="fases<? echo $i;?>" name="fases<? echo $i;?>" >
<option selected value="0">Seleccione            </option>
<?
while($fi!=0)
{
$fo=mysql_fetch_array($fe);
?>
<option value="<? echo $fo['fas_id'] ?>" > <? echo $fo['fas_nombre']; ?></option>
<?
$fi=$fi-1;
}
?>
</select>
</span>
</td>
<td width="240" align="left"> <span class="Estilo8">
<select id="subfases<? echo $i; ?>" name="subfases<? echo $i; ?>">
<option selected value="0">Seleccione            </option>
</select>
</span>
</td>
<td width="130" align="right">
<span class="Estilo8">
<?
$fecha_ini="txt_fecha".$i;
escribe_formulario_fecha_vacio($fecha_ini,"registro_e","");
?>
</span> </td>
<td width="130" align="right">
<span class="Estilo8">
<?
$fecha_fin="txt_fechaf".$i;
escribe_formulario_fecha_vacio($fecha_fin,"registro_e","");
?>
</span> </td>
<td width="100" align="right">
<span class="Estilo8">
<input type="text" id="por<? echo $i; ?>" name="por<? echo $i; ?>" size="2" maxlength="2" onChange="suma(this.id,<? echo $nu; ?>)">
%
</span></td>
</tr>
<?
}
?>
<tr>
<td colspan="4">
<div align="right" class="Estilo6 Estilo9">Porcentaje Total</div>
</td>
<td width="100" align="right">
<span class="Estilo8">
<input type="text" id="respor" name="respor" size="2" maxlength="3" disabled="true">
%
</span></td>
</tr>
</table>
<table align="center" cellspacing="5" cellpadding="5" width="800">
<input type="hidden" name="id" value="<? echo $a;?>" >
<input type="hidden" name="num" value="<? echo $nu;?>" >
<tr>
<td colspan="2" align="center"><input type="reset" name="boton" value="Refrescar" ></td>
<td colspan="2" align="center"><input type="button" name="submit1" value="Guardar" onClick="direccionar2('procesar_cargaf.php?',<? echo $nu;?>);"></td>
</tr>
</table>
</form>
<?
}
?>
¿Cuántas fases y subfases tienes en total?
BUenas Tardes, Tengo n Fases con n Subfases
Conseguí un ejemplo que me fue muy útil, gracias por tu ayuda.
Bueno aquí va un ejemplo
1) Crear una base de datos (MYSQL) de nombre mibase
2)Ejecutar las instrucciones sql
3)Probar el archivo
*********SCRIPT SQL****************
# Tabla departamentos
CREATE TABLE `departamentos` (
`Id` int(6) unsigned NOT NULL auto_increment,
`Id_depto` int(4) NOT NULL default '0',
`nombre_depto` varchar(50) default NULL,
UNIQUE KEY `indice` (`Id`,`Id_depto`)
) TYPE=MyISAM;
INSERT INTO `departamentos` VALUES (1,1,'Contabilidad');
INSERT INTO `departamentos` VALUES (1,2,'Marketing');
INSERT INTO `departamentos` VALUES (1,3,'Bodega Central');
INSERT INTO `departamentos` VALUES (2,1,'Informatica');
INSERT INTO `departamentos` VALUES (2,2,'Ventas');
INSERT INTO `departamentos` VALUES (2,3,'Gerencia');
INSERT INTO `departamentos` VALUES (3,1,'Capacitacion');
INSERT INTO `departamentos` VALUES (3,2,'Abastecimiento');
INSERT INTO `departamentos` VALUES (3,3,'Recursos Humanos');
# Tabla empresas
CREATE TABLE `empresas` (
`Id` int(6) unsigned NOT NULL auto_increment,
`descripcion` varchar(10) default NULL,
PRIMARY KEY (`Id`)
) TYPE=MyISAM;
INSERT INTO `empresas` VALUES (1,'Empresa001');
INSERT INTO `empresas` VALUES (2,'Empresa002');
INSERT INTO `empresas` VALUES (3,'Empesa003');
*********FIN SCRIPT SQL*******************
***********PAGINA PHP********************
<?
$bd_host = "localhost";
$bd_usuario = "localhost";
$bd_password = "";
$bd_base = "mibase";
$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
$sql = "SELECT * from empresas";
$rs = mysql_query($sql, $con);
?>
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p>Seleccion de un select y cambiar los valores de otro select sin tener que submitar (valido segun su uso)</p>
<form name="miformulario" method="get">
<table width="249" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Empresa</td>
<td>Departamento</td>
</tr>
<tr>
<td><select name="empresa" id="empresa" onChange="componer_Centros(this.value)">
<option value="">--Seleccione--</option>
<? if(mysql_num_rows($rs)>0)
{
while($row = mysql_fetch_assoc($rs))
{
?>
<option value="<?=$row["Id"]?>"><?=$row["descripcion"]?></option>
<?
}
}
?>
</select></td>
<td><select name="depto" id="depto">
<option>--seleccione--</option>
</select></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</table>
</form>
</body>
</html>
<script>
function componer_Centros(cod_area)
{
//alert(cod_area);
document.miformulario.depto.length=0;
document.miformulario.depto.options[0] = new Option("-- Seleccione --","","defaultSelected","");
var indice=1;
<?
$sql_depto = "SELECT * from departamentos";
$rs_depto = mysql_query($sql_depto, $con);
if(mysql_num_rows($rs_depto)>0)
{
while($row_depto = mysql_fetch_assoc($rs_depto))
{
?>
if(cod_area=='<?=$row_depto["Id"]?>')
{
document.miformulario.depto.options[indice] = new Option("<?=$row_depto["nombre_depto"]?>","<?=$row_depto["Id_depto"]?>");
indice++;
}
<?
}
}
mysql_close($con);
?>
}
</script>
***********FIN PAGINA PHP*****************
Respuesta

Les recomiendo ver Saló, o los 120 días de Sodoma online utilizan algunas técnicas parecidas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas