Foros del Web » Programando para Internet » PHP »

Actualizar Select

Estas en el tema de Actualizar Select en el foro de PHP en Foros del Web. Hola amigos, este es mi primer mensaje, en esto de HTML soy totalmente novato, ya que acabo de empezar. Trabajo, ó, intento trabajar con HTML, ...
  #1 (permalink)  
Antiguo 12/09/2003, 03:38
Avatar de Ferdy(Toledo)  
Fecha de Ingreso: septiembre-2003
Ubicación: TOLEDO
Mensajes: 8
Antigüedad: 20 años, 7 meses
Puntos: 0
Pregunta Actualizar Select

Hola amigos, este es mi primer mensaje, en esto de HTML soy totalmente novato, ya que acabo de empezar. Trabajo, ó, intento trabajar con HTML, PHP y MYSQL.

Mi problema es el siguiente:

Tengo dos Select en un formulario, uno selecciona una provincia y el otro una localidad, estos selects se nutren de una base de datos MySql en principio la select es fácil, me muestra todas las provincias y todas la localidades, pero lo que yo quisiera es que cuando seleccionara una provincia (evento onChange, creo, ¿no?) se me actualizara el select de las localidades, mostrando sólo los que correspondan a la provincia seleccionada, ¿como lo hago?, lo he intentado de mil formas, bueno, sin exagerar, sólo novecientas, y me estoy volviendo loco. Aquí os envio el código.
¡¡Muchas Gracias por anticipado!!


<html>

<head>
<title> Mi título... /title>


</head>
<body class="bodyFondo">

<?

...
...


// Definimos variables globales
global $provincia, $localidad, $consultasql, $resultado;

if ($provincia=="") { $provincia="TODAS"; }
$localidad="TODAS";


// Incluyo el fichero de conexión a la Base de Datos.
include("modules/Centros/conexion.php");
ConectaBaseDeDatos();
// Incluyo el fichero de funciones
include("modules/Centros/ffcentros.php");
// Creo la sentencia SQL
$consultasql = sentenciasql($provincia, $localidad);

?>

...
...


<form name="frm1" method="post" action="modules.php?name=Centros&file=listado">
<!-- <script language="JavaScript" type="text/JavaScript" src="centros.js"></script> -->
<table width="100%" border="0">
<tr>
<td width="10%"></td>
<td width="10%">Provincia:</td>
<td>


<? $cadenachange="location.href='modules.php?name=Cen tros&file=index'&provincia=" .$provincia; ?>
<select name="provincia" onChange="<? print($cadenachange) ?>" >

<? $consultaprov ="SELECT * FROM provincias ORDER BY provincia"; ?>
<option value="<? echo $provincia ?>" selected><? echo $provincia ?></option>
<?
$rs = mysql_query($consultaprov, $conexion);
$filas=mysql_num_rows($rs);
if ($filas > 0) {
while ($filas = mysql_fetch_array($rs)) {
$prov=$filas[provincia];
?>
<option value="<? print($prov) ?>" >
<? print($prov) ?> </option>
<?
} // Fin del While
} // Fin del if ($filas > 0
?>
</select></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%">Localidad:</td>
<td><select name="localidad" >
<option value="<? echo $localidad ?>" selected><? echo $localidad ?></option> <?
$resultado = mysql_query($consultasql, $conexion);
$filas=mysql_num_rows($resultado);
if ($filas > 0) {
$xxx="";
while ($filas = mysql_fetch_array($resultado)) {
$loc=$filas[localidad];
if ($loc!=$xxx) { // Para que no se repitan los municipios en la lista.
$xxx=$filas[localidad];
?>
<option value="<? print($loc) ?>" >
<? print($loc) ?> </option>
<?
} // Fin del if (loc!=$xxx)

} // del while
} // del if($filas > 0)
?>
</select></td>
</tr>
</table>

<!-- Botón Buscar -->
<table width="100%" border="0">
<tr>
<td width="10%"></td>
<td><input type="image" src="modules/Centros/imagenes/Buscar.gif" name="Buscar"></td>
<!-- <td><input type="submit" value="Buscar" name="Buscar"></td> -->
</tr>
</table>
</form>


</body>
</html>

Última edición por Ferdy(Toledo); 02/08/2005 a las 05:13
  #2 (permalink)  
Antiguo 12/09/2003, 14:31
 
Fecha de Ingreso: julio-2002
Mensajes: 322
Antigüedad: 21 años, 9 meses
Puntos: 0
Este es el tipico problema de selects encadenados, que ya se ha contestado en este foro (y en cientos de paginas) alguna que otra vez. Date una vuelta por los mensajes anteriores.
__________________
Saludos

Rubén
Teléfonos móviles, curiosidades: http://telefonos-moviles.muchodenada.com/
  #3 (permalink)  
Antiguo 15/09/2003, 00:30
Avatar de Ferdy(Toledo)  
Fecha de Ingreso: septiembre-2003
Ubicación: TOLEDO
Mensajes: 8
Antigüedad: 20 años, 7 meses
Puntos: 0
Leer mensajes anteriores

Hola Ruben

Te puedo asegurar, que antes de preguntar en este foro he mirado y remirado por todas partes, incluido en los mensajes anteriores de este foro. Debo ser, además de novato, un inutil ya que no he encontrado respuesta al problema que aquí he planteado. Es posible que en este foro haya muchas respuestas a mi pregunta, pero, ¿hasta que fecha me remonto para buscar?; ten en cuenta que esta es la primera vez que entraba en este foro, sino quieres contestarme no lo hagas, pero ya que lo has hecho y, de esta manera, al menos me podrias haber indicado donde buscar exactamente.

De todas formas, muchas gracias.

Un Saludo,
  #4 (permalink)  
Antiguo 15/09/2003, 01:12
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 22 años, 2 meses
Puntos: 772
Hola, Ferdy(Toledo).

Creo que Ruben se refiere a la FAQ-1 de JavaScript -> Pulsame

Saludos,
  #5 (permalink)  
Antiguo 15/09/2003, 01:41
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61


Pensando pensando, pensé en una forma de hacerlo sin tener que cargar de primeras todas las localidades. Y he llegado a esta conclusión. Creo que sólo funciona en IE, pero todo es probar. Consiste en tener una lista de archivos js con el nombre de cada una de las provincias (madrid.js, barcelona.js...) y dentro de cada uno habría un array llamado localidad con todas las localidades de cada una de esas provincias. Algo así:

En Madrid.js sería

localidad=["Alcalá de Henares","villaescusa del sordete", Madrid", "Getafe", "móstoles"...]

En Barcelona.js sería

localidad=["Barcelona","Splugat de Llbregat","casa Tarradellas",...]

Luego en la página habría 2 selects, seleccionando el array con las localidades y generándose el segundo según la elección del primero. El código sería algo así

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<
html>
<
head>
    <
script id="pepe"></script>
    <script>
    
    function segundo(primero){
    textoSegundo="<select name='localidades'>";
    document.getElementById("pepe").src=primero+".js";
    for(a=0;a<localidad.length;a++){
    textoSegundo+="<option value='"+localidad[a]+"'>"+localidad[a]+"</option>";
    }
    textoSegundo+="</select>";
    document.getElementById("segundin").innerHTML=textoSegundo;

    }
    
    </script>
    
</head>

<body><form>
<select name="provincia" size="1" onchange="segundo(this.value)">
                        <option value="1" SELECTED>Este es el 1</option>
                        <option value="2">Este es el 2</option>
                        <option value="3">Este es el 3</option>
                        <option value="4">Este es el 4</option>
                        <option value="5">Este es el 5</option>
</select>
<span id="segundin"><select disabled>
<option>Seleccione Provincia</option>
</select></span>

</form>

</body>
</html> 

Lo he hecho con números, pero como supondreis se puede hacer con cualquier cosa. En este ejemplo el archivo 1.js sería:
Código PHP:
localidad=["01","11","21","31"]; 

el 2.js:
Código PHP:

localidad
=["02","12","22","32"]; 

Etc.

No sé si ha quedado claro. Lo he hecho en JS porque según parece buscas que sea inmediato y que no haya que cargar la página de nuevo. Como PHP no está "orientado a eventos" habría que mandar la selección al servidor, que viese la selección, montase el select y volver a mostrar la página. Esto es más rápido y el efecto es el mismo. En cualquier caso mis conocimientos de PHP son bastante limitados, por lo que tal vez se pueda hacer y alguien me contradiga. Si es así pues fenomenal porque todos aprenderemos algo.

Un saludo y traslado tu pregunta a JS!
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #6 (permalink)  
Antiguo 15/09/2003, 03:30
Avatar de Ferdy(Toledo)  
Fecha de Ingreso: septiembre-2003
Ubicación: TOLEDO
Mensajes: 8
Antigüedad: 20 años, 7 meses
Puntos: 0
Hola de nuevo karlankas y cia.

El problema es que las select las hago de una base de datos de MySql, o sea que creo una consula SQL en función de lo que selecciono en los select, en principio la consulta es "SELECT * FROM centros", si selecciono una provincia la consulta sería "SELECT * FROM centros WHERE provincia= '$provincia' y si hubiera seleccionado municipio, pues AND municipio= '$municipio'. Problema; pues que si selecciono la provincia de Albacete, antes de darle al botón enviar si intento seleccionar un municipio concreto, me muestra absolutamente todos y yo quisiera que me mostrara solo los de la provincia de Albacete que estén dentro de la taba de MySql, resumiendo, que lo que necesito es que cuando cambie la select de provincia la select que está en una función php cambie y se refresque la página, ¿me explico?. La función lo único que hace es crear la cadena "SELECT * FROM...", lo que hago es "$consultasql=funcioncreaconsulta($provincia, $municipio);"

Por lo tanto, creo que no me sirven ni la idea de JabierB ni la de Karlankas.
  #7 (permalink)  
Antiguo 15/09/2003, 10:44
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61
Vamos a ver, entonces podrías hacer lo siguiente. No lo he probado, pero es para que cojas la idea. Debe ser algo parecido a lo que puedes encontrar en http://callejero.terra.es
Seleccionas antes la provincia y luego el municipio.

<?
include("conexion.php");

if(isset($provincia)){
$destino="destino.php";
$cambio="'document.forms[0].submit()'";
}
else{$destino=$PHP_SELF;
$cambio="''";
} <form action=<?echo $destino; ?>>
<?
$sentenciaSQL="SELECT provincia FROM centros";
$resultadoSQL=mysql_query($sentenciaSQL,$conexionB D);
echo "<select onchange=".$cambio." name='provincia'>";
while ($resultado=mysql_fetch_array($resultadoSQL)){
echo "<OPTION value='".$resultado["municipio"]."'>".$resultado["municipio"]."</OPTION>";
}
echo "</SELECT>";

if(isset($provincia)){
$sentenciaSQL="SELECT municipio FROM centros WHERE provincia='".$provincia."'";
$resultadoSQL=mysql_query($sentenciaSQL,$conexionB D);
echo "<select name='municipio'>";
while ($resultado=mysql_fetch_array($resultadoSQL)){
echo "<OPTION value='".$resultado["municipio"]."'>".$resultado["municipio"]."</OPTION>";
}
echo "</SELECT>";
}
else{
echo <SELECT DISABLED>
<option>Seleccione una provincia</option>
</select>
}

?>
<input type="submit">
</form>

Y si no te parece mal nos vamos a PHP...
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #8 (permalink)  
Antiguo 17/09/2003, 04:23
Avatar de Ferdy(Toledo)  
Fecha de Ingreso: septiembre-2003
Ubicación: TOLEDO
Mensajes: 8
Antigüedad: 20 años, 7 meses
Puntos: 0
Gracias por tu ayuda Karlankas, creo que esto último me puede servir, ahora estoy muy liado con otras cosas y no lo puedo probar, seguramente que lo haré la semana que viene, ya te contaré, sobre todo si no me funciona.

Gracias a todos lo que habeis colaborado, espero que un futuro, no muy lejano, yo también os pueda ayudar.
  #9 (permalink)  
Antiguo 17/09/2003, 08:56
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61
Movamos esto desde JS a PHP
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #10 (permalink)  
Antiguo 18/09/2003, 16:47
Usuario no validado
 
Fecha de Ingreso: abril-2002
Ubicación: mx
Mensajes: 65
Antigüedad: 22 años
Puntos: 0
Que sea dinamico

Ya he Actualizado un select actualizando toda la pagina, pero lo que no he podido hacer, , es actualizar un select dinamicamente, osea sin actualizar toda la pagina.

OJO los datos del select son extraidos de la BD.

Veamos: Tenemos 2 select en el primero estan las ciudades cargadas de una BD. y el segundo select tiene los poblados de dicha ciudad, dicho select deseo actualizarlo dinamicamente, sin actualizar toda la pagina.

Alguien sabe como. OJO se manejan los datos de la BD con php.

Heeelllpp meee...
  #11 (permalink)  
Antiguo 18/09/2003, 16:53
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

¿Sin recargar la pagina? PUEs con JAVASCRIPT. PHP solo se ejecuta cuando haces una peticion al servidor.

Supongo que en el foro de javascript tienen un ejemplo. Solo tendrias que cargar todos los datos de todas las ciudades y todos los poblados desde la BD en los arrays javascript. Creo que tambien hay un ejemplo en el FAQ de PHP. Y creo que un usuario hizo un ejemplo bastante bueno tambien en el foro de PHP, usa el buscador.

Eso si, si tienes miles de poblados la pagina tardara en cargarse, ya que en el HTML generado estaran todos los valores de la tabla.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #12 (permalink)  
Antiguo 23/09/2003, 06:31
Avatar de Ferdy(Toledo)  
Fecha de Ingreso: septiembre-2003
Ubicación: TOLEDO
Mensajes: 8
Antigüedad: 20 años, 7 meses
Puntos: 0
Hola karlanKas

He estado probando la solución que me diste y casi me vuelvo loco, y cuando ya estaba a punto de dejarlo por imposible, mirando en Internet, por supuesto, he dado con la solución; quizás sea un poco chapuza, pero a mi me vale. Se trata de refrescar la página, quizás sea muy simple y muy fácil para la gente de este foro, pero uno es principiante y salvo Internet, no tengo ninguna ayuda y como no me ponga rápidamente las pilas en mi trabajo...

Esto es más o menos el código, por si a alguien le sirve:

...

</head>
<body class="bodyFondo">

...

// Definimos variables globales
global $provincia, $localidad, $nombrecen, consultasql, $resultado;

$pr;
$provincia = $_GET["pr"];

...

...


<table width="100%" border="0">
<tr>
<td width="10%"></td>
<td width="10%">Provincia:</td>
<td>
<select name="provincia" onchange="document.location='modules.php?name=Cent ros&file=index'+'&pr='+this.value">
<? $consultasql ="SELECT * FROM provincias ORDER BY provincia"; ?>
<option value="<? echo $provincia ?>" selected><? echo $provincia ?></option>
<?
$resultado = mysql_query($consultasql, $conexion);
$filas=mysql_num_rows($resultado);
if ($filas > 0) {
while ($filas = mysql_fetch_array($resultado)) {
$xprov=$filas[provincia];
?>
<option value="<? print($xprov) ?>" ><? print($xprov) ?> </option>
<?
} // Fin del While
} // Fin del if ($filas > 0
?>
</select></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%">Localidad:</td>
<td><select name="localidad" >
<option value="<? echo $localidad ?>" selected><? echo $localidad ?></option> <?
// $consultasql = sentenciasql($provincia, $localidad, $nombrecen);
$consultasql = sentenciasql($provincia, $localidad, $nombrecen);
$resultado = mysql_query($consultasql, $conexion);
$filas=mysql_num_rows($resultado);
if ($filas > 0) {
$xxx="";
while ($filas = mysql_fetch_array($resultado)) {
$xloc=$filas[localidad];
if ($xloc!=$xxx) { // Para que no se repitan los municipios en la lista.
$xxx=$filas[localidad];
?>
<option value="<? print($xloc) ?>" > <? print($xloc) ?> </option>
<?
} // Fin del if (xloc!=$xxx)

} // del while
} // del if($filas > 0)
?>
</select></td>
</tr>
</table>


Esto funciona; de todas formas acepto nuevas sugerencias:
¡¡Muchas Gracias por vuestra ayuda!!
  #13 (permalink)  
Antiguo 23/09/2003, 16:46
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 22 años, 5 meses
Puntos: 5
Yo te recomendaria que hicieras uso de Remote Scripting, que lo que hace es recargar los datos de un select por ejemplo sin refrescar la ventana y te preguntaras como ... pos la verdad no me e molestado en mirarlo jeje pero con los archivos jsrsXXXXXX.js puedes hacerlo ahora mismo no me acuerdo la web pero busca en google Remote Scripting o JSRS y lito tienes ejemplos de lo que quieres hacer :P
__________________
Usuario registrado de Linux #288725
  #14 (permalink)  
Antiguo 17/07/2005, 05:35
Avatar de dopon  
Fecha de Ingreso: julio-2005
Ubicación: Cucuta / Colombia
Mensajes: 493
Antigüedad: 18 años, 9 meses
Puntos: 1
Hmmm lei este mensaje que por lo visto es viejo pero nadie pueso un link o ejemplo en concreto lo de refrescar un select sin recargar toda la pagina se puede lograr con javascript y la etiqueta IFRAME claro y generando los combos dinamicamente en php


aca esta una pagina que fue donde logre entender a la perfeccion eso que siempre habia deseado ;)

http://www.rinconastur.net/php/php86b.php
  #15 (permalink)  
Antiguo 18/07/2005, 03:20
Avatar de Ferdy(Toledo)  
Fecha de Ingreso: septiembre-2003
Ubicación: TOLEDO
Mensajes: 8
Antigüedad: 20 años, 7 meses
Puntos: 0
Refrescar selects (mi solución definitiva).

Hola Amigos
Hace tanto ya de este tema que ni me acordaba. Por si a alguien le sirve de algo, aquí va la solución definitiva por la que opté.

En primer lugar tengo una función para crear desplegables (selects), que puede venir muy bien si tienes bastantes desplegables que hacer en tu página. Esta es la función:

/* -------------------------------------------------------------------------------------------
Función que muestra un select con las opciones que recibe.
Parámetros:
$NombreCampo -> Nombre del select
$ValorCampo -> Valor por defecto del select
$ArrayOpcionesValor -> Array con los valores de las opciones que presentará el select.
$ArrayOpcionesTexto -> Array con las opciones que presentará el select.
$clase -> Si estás utilizando un fichero de estilos "css", aquí pones el nombre de la clase.
$change -> La función que llamará el evento "onChange"
---------------------------------------------------------------------------------------------- */
function CreaDesplegable($NombreCampo, $ValorCampo, $ArrayOpcionesValor, $ArrayOpcionesTexto, $clase="", $change="") {
$num_opciones = count($ArrayOpcionesValor);
echo "<select name='" .$NombreCampo ."' class='".$clase."' onChange='".$change."' >\n";
for ($i=0; $i < $num_opciones ; $i++) {
if ($ValorCampo == $ArrayOpcionesValor[$i]) { $seleccionado = "selected"; } else { $seleccionado = ""; }
echo "<option value='" .$ArrayOpcionesValor[$i] ."' ".$seleccionado." >" .$ArrayOpcionesTexto[$i] ."</option>\n";
}
echo "</select>\n";
}

Esta función lo mejor es que vaya un un fichero de funciones al que puedas llamar desde cualquiera de tus páginas cuando lo necesites mediante un include, el fichero se podría llamar "misfunciones.php".


Vamos con el fichero donde mostraremos nuestros desplegables, en este caso "index.php":

En primer lugar tendremos un par de funciones de JavasCript para cuando seleccionemos algo en cualquiera de nuestros desplegables.


?>
<script language="JavaScript" type="text/JavaScript">
<!--
function cambia_provincia() {
var puntero = document.formulario.localidad;
document.formulario.action = "index.php";
puntero.value = "";
document.formulario.submit();
}

function cambia_localidad() {
var puntero1 = document.formulario.localidad;
var puntero2 = document.formulario.select_localidad;
puntero1.value = puntero2.value;
}

//-->
</script>
<?

// Incluimos nuestro fichero de funciones
include("misfunciones.php");


if (!isset($_POST['provincia'])) { $provincia = 0; } else { $provincia = $_POST['provincia']; }
if (!isset($_POST['localidad'])) { $localidad = 0; } else { $localidad = $_POST['localidad']; }


// Aquí nuestras funciones para conectar a la base de datos.
...
...
...

// Seleccionamos las provincias de la base de datos MySQL
// Y guardamos en arrays el resultado. $ArrayProvinciasID y $ArrayProvinciasTXT
$SQL = "SELECT ID, provincia FROM provincias ORDER BY provincia";
...
...
// OjO en los arrays anteriores deberá haber un $ArrayProvinciasID[n] = 0 y un $ArrayProvinciasTXT[n] = "Seleccione una provincia."




// Seleccionamos las localidades de la base de datos, de la provincia correspondiente.
// Y guardamos en arrays el resultado. $ArrayLocalidadesID y $ArrayLocalidadesTXT
if ($provincia == 0) {

$ArrayLocalidadesID[0] = 0;
$ArrayLocalidadesTXT[0] = "";

} else {

$SQL = "SELECT ID, localidad FROM localidades WHERE ID_provincia='".$provincia."'";
...
...


}

// Ponemos el <html>, <head>, <body> etc. etc.


echo "<form name='formulario' method='post' >";

echo"<input type='hidden' name='localidad' value='" .$localidad ."' >\n";

// Creamos el primer desplegable, el de las provincias.
CreaDesplegable("provincia", $provincia, $ArrayProvinciasID, $ArrayProvinciasTXT, "", "cambia_provincia()");

// Creamos el segundo desplegable, el de las localidades.
CreaDesplegable("select_localidades", $localidad, $ArraylocalidadesID, $ArraylocalidadesTXT, "", "cambia_localidad()");

...
...
...

echo "</form>";

...
...

// etc. etc.

Espero que os sirva para algo el ejemplo.
Un Saludo a tod@s,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:35.