Foros del Web » Programando para Internet » PHP »

Consulta asesina

Estas en el tema de Consulta asesina en el foro de PHP en Foros del Web. Saludos compañeros foreros! Recurro a ustedes porque mi cabeza ya no da para más. Os pongo en situación Tengo una tabla lista_clientes que contiene, entre ...
  #1 (permalink)  
Antiguo 24/05/2013, 05:53
Avatar de the_sheriff_pino  
Fecha de Ingreso: abril-2013
Ubicación: Córdoba
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Consulta asesina

Saludos compañeros foreros!
Recurro a ustedes porque mi cabeza ya no da para más.

Os pongo en situación
Tengo una tabla lista_clientes que contiene, entre otros campos, un campo Provincia.
También tengo una tabla lista_provincias que contiene los campos id, provincia.
Y una tabla lista_poblaciones que contiene los campos id(El mismo que la provincia), poblacion.

Vamos al meollo!

En un formulario de crear cliente, a la hora de meter la provincia y la población, al usuario se le muestra una lista desplegable con todas las provincias, y cuando selecciona una de ellas, con jQuery, se le muestra otra lista desplegable con las poblaciones que pertenecen a la provincia seleccionada. (Recuerdo que tienen en común el ID).

Pues cuando quiero mostrar los datos del cliente, en los input type=text no hay problema; pero tanto la provincia como la población las cargo en un select, mostrándose la opción selected, la obtenida del campo Provincia de la tabla lista_clientes.

La cuestión es: como le digo yo a la página que el valor obtenido de la provincia del cliente lo relacione con la provincia del mismo nombre de la tabla provincias, para que se pueda ejecutar el jQuery y así mostrarme directamente la lista con las poblaciones de esa provincia.

Resumiendo: Cargar el valor del campo[Provincia] de la tabla[lista_clientes], asociarle el ID que le correspondería de la tabla[lista_provincias] para que se pueda mostrar luego la lista de las poblaciones.

Perdonen la chapa, pero creo que mejor explicarlo todo de una vez.

Os dejo el código que afecta para aclararos un poco.

Este fragmento de código es el que crea los select.
Código PHP:
if(isset($_POST['cargar'])) //Se obtiene al pulsar el botón [Datos de cliente] en una página anterior
        {    
            $cif    =    $_POST['clientes'];
            
            $consultaprov    =    "SELECT * FROM lista_clientes WHERE CIF='".$cif."'";
            $rconsultaprov    =    mysql_query($consultaprov,$link);
            
            while ($fila    =    mysql_fetch_assoc($rconsultaprov)) //Obtenemos la provincia y población del cliente en dos text.
                { ?>
                       <label for="Field6">Provincia</label>
                    <input type="text" value="<?php echo $fila['Provincia'];?>" name="prov" disabled style="text-transform:uppercase;">
                    <label for="Field6">Población</label>
                    <input type="text" value="<?php echo $fila['Localidad'];?>" name="pobl" disabled style="text-transform:uppercase;">
                    <br>
            <?php  $pepe=$fila['Provincia'];
            global 
$pepe;?>

            Si desea modificarla, elija una de la lista:<br>
            Provincia:
          <?php    }    ?>
                <select id="lista1" name="lst1" class="field select addr" >            
      <?php $consulta_prov    =    " SELECT * FROM lista_clientes WHERE CIF='".$cif."'";
            
$rconsulta_prov    =    mysql_query($consulta_prov,$link);
            
            while (
$fila    =    mysql_fetch_assoc($rconsulta_prov))
                { 
?>
                    <option selected value="<?php echo $fila['Provincia'];?>"><?php echo $fila['Provincia'];?></option>                
        <?php     }            
                
                
$consulta="SELECT * FROM lista_provincias";
                
$completa=mysql_query($consulta,$link);?>

        <?php    while ($fila=mysql_fetch_assoc($completa))
                    {    
?>
                        <option value="<?php echo $fila['id'];?>"><?php echo $fila['opcion'];?></option>
        <?php       }    
                
$pepe=$fila['id'];
                global 
$pepe;
                
?>
                
                </select>  
                
                
    
    <select id="lista2" name="lst2" class="field select addr">

        <?php $consulta_pobl    =    " SELECT * FROM lista_clientes WHERE CIF='".$cif."'";
            
$rconsulta_pobl    =    mysql_query($consulta_pobl,$link);
            
            while (
$fila    =    mysql_fetch_assoc($rconsulta_pobl))
                { 
?>
                    <option selected value="<?php echo $fila['Localidad'];?>"><?php echo $fila['Localidad'];?></option>                
        <?php     }            

                
$consultapobl9    =    "SELECT lista_poblaciones.opcion FROM lista_provincias JOIN lista_poblaciones 
                                    ON lista_provincias.id =lista_poblaciones.id WHERE lista_provincias.opcion ='"
.$pepe."' ORDER BY opcion ASC";
                
$rconsultapobl9    =    mysql_query($consultapobl9,$link);
                    while (
$fila=mysql_fetch_assoc($rconsultapobl9))
                       {    
?>
                 <option value="<?php echo $fila['opcion'];?>"><?php echo $fila['opcion'];?></option>
        <?php        }    ?>
    </select>        
 <?php    }    ?>
 
 <table>
     <tr>
            <td id="slista">
                        
            </td>
    
        </tr>
    </table>

</span>
Este fragmento es el de jQuery, que hace que cuando selecciones una provincia cargue el select de poblaciones de esa provincia. Atención a la tabla del final del fagmento anterior donde se cargaría el resultado de este script.
Código Java:
Ver original
  1. $(document).on("ready",function()
  2.     {
  3.         $('#lista1').on("change",function()
  4.         {
  5.             var id = $('#lista1').val();
  6.             var metodo = $('#formulario').attr('post')
  7.             $.ajax(
  8.             {
  9.                 url:"mostrarpoblaciones3.php",
  10.                 type:metodo,
  11.                 data:{identidad: id},
  12.                 success: function(resp)
  13.                 {  
  14.                     $('#slista').html(resp);   
  15.                 },
  16.                 error: function(jqXHR,estado,error)
  17.                 {
  18.                     alert("No se ha podido realizar la consulta a la base de datos, por favor intentelo de nuevo");
  19.                 }
  20.             });
  21.         });
  22.    
  23.     });

Esta es la página de mostrarpoblaciones3.php, nombrada en el código de jQuery.
Código PHP:
<?php
$link
=mysql_connect("localhost","root","");
mysql_select_db("clientes",$link);
$id=$_GET['identidad'];

$consulta="SELECT DISTINCT id, opcion FROM lista_poblaciones WHERE id = $id ORDER BY opcion ASC";
$completa=mysql_query($consulta,$link);?>
<span class="rigth state">
        <label for="Field6">Población</label>
<select id="lista2" name="lst2" class="field select addr">

        <?php
            
while ($fila=mysql_fetch_assoc($completa))
            {
        
?>

                 <option value="<?php echo $fila['opcion'];?>"><?php echo $fila['opcion'];?></option>


        <?php
                
            
}
        
?>
</select>
</span>
  #2 (permalink)  
Antiguo 24/05/2013, 06:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta asesina

OFF TOPIC

El tema es el manejo del formulario, basado en los combos de selección.

Movido a PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/05/2013, 06:29
Avatar de the_sheriff_pino  
Fecha de Ingreso: abril-2013
Ubicación: Córdoba
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Consulta asesina

Los has leido entero, gnzsoloyo?
  #4 (permalink)  
Antiguo 24/05/2013, 06:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta asesina

Lo pasé para no tener que borrar el código de PHP y todo lo demás, ya que no se tratan ni se postean cosas de programación en los foros de BBDD.
Además, esto:
Cita:
La cuestión es: como le digo yo a la página que el valor obtenido de la provincia del cliente lo relacione con la provincia del mismo nombre de la tabla provincias, para que se pueda ejecutar el jQuery y así mostrarme directamente la lista con las poblaciones de esa provincia.

Resumiendo: Cargar el valor del campo[Provincia] de la tabla[lista_clientes], asociarle el ID que le correspondería de la tabla[lista_provincias] para que se pueda mostrar luego la lista de las poblaciones.
Se refiere a acciones a realizar después de leer las tablas de datos base, y en el formulario, no en la base.
Y todo lo que hagas en los formularios es irrelevante para la base de datos, porque esta recibe datos o envía datos, pero no resuelve la lógica de negocio de la aplicación.

¿Se entiende la distinción?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/05/2013, 08:25
Avatar de the_sheriff_pino  
Fecha de Ingreso: abril-2013
Ubicación: Córdoba
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Consulta asesina

Si lo entiendo amigo, si lo puse en mysql es porque creía que con alguna consulta en con algún tipo de inner join podría hacerlo.

Gracias por todo!
  #6 (permalink)  
Antiguo 24/05/2013, 08:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta asesina

Entiendo.
En realidad el INNER JOIN sólo te puede ayudar a generar una única consulta que devuelva provincias y localidades en el mismo resultado, pero luego deberás recorrerlo programáticamente para ubicar uno y otro, con la complicación de que la cantidad de datos va a ser mayor.
A nivel de perfomance, es mejor hacer que si seleccionas uno, filtre la consulta para el otro, en secuencia, una secuencia de selección que puedes obligar al usuario a respetar inhabilitando y habilitando los combos según las selecciones a realizar (como se suele hacer).
Yo no lo veo práctico a traer todo en una única tabla, porque la latencia de la red no es tan grande como para justificar "acelerar" un paso sobrecargando de datos innecesariamente la conexión.
Creo que la lógica que ya tienes es más apropiada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/05/2013, 09:15
Avatar de the_sheriff_pino  
Fecha de Ingreso: abril-2013
Ubicación: Córdoba
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Consulta asesina

Entonces creo que no me entendiste bien.

Con el jQuery lo que tengo es una lista desplegable de provincias, y al seleccionar una de ellas se me muestra otra lista desplegable con las localidades de esa provincia. Hasta ahí bien.

Lo que yo quiero es que la Provincia del cliente, se introduzca como predeterminada en el select de provincia(eso lo tengo.), pero esa provincia no tiene un value=id que mandar para que se pueda mostrar la otra lista desplegable con las poblaciones.
La verdad es que creo que voy a tener que hacer un vídeo señalando en la pantalla que es exactamente lo que necesito jaja ;)

Otra opción sería mostrar la provincia y poblacion de cliente con un echo o en un input type=text disabled, y poner un botón que sea modificar prov. y pobl., y que al pulsar ese botón se muestren los select de provincia y cuando selecciones uno, el de población.
  #8 (permalink)  
Antiguo 24/05/2013, 09:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta asesina

Cita:
pero esa provincia no tiene un value=id
¿Me estás diciendo que esa tabla no tiene PK?
¿O usas el nombre como PK?
Si es así, hay algo mal, porque de algún modo debes identificarla. Si no tiene un ID numerico, entonces debes usar la PK que la tabla tenga. Y si no tiene PK... tienes que crearla, sea declarando el nombre como tal, o bien adicionándole una PK que quieras.
Lo que no puede existir jamás es una tabla sin PK.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 24/05/2013, 09:42
Avatar de the_sheriff_pino  
Fecha de Ingreso: abril-2013
Ubicación: Córdoba
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Consulta asesina

Creo que te he entendido.
La tabla clientes tiene los campos DNI, Nombre, Dirección, Tlf, Cuenta Bancaria, Forma de Pago, Provincia y Localidad. A lo mejor se me ha escapado alguno pero no es importante.
Entonces, al mostrar yo en un select el campo clientes.Provincia, que obtenga el valor=ID que le corresponda de la lista_provincias.ID.
De esta forma, cuando cargue en el select la provincia del cliente, automáticamente se desplegará la tabla con las localidades pertenecientes a esa provincia.

Estamos de acuerdo o no se ve claro aún?
  #10 (permalink)  
Antiguo 24/05/2013, 09:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta asesina

Esa sería la idea.
Aunque trabajes con un único país, donde es imposible que exista más de una provincia del mismo nombre, de todos modos tienes que ponerle una clave primaria, sea o no numérica. Y es a esa clave la que debes usar para los filtrados y luego para los INSERT donde haya que relacionarla.
Yo asumía que ese detalle ya estaba implementado así...

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 24/05/2013, 09:54
Avatar de the_sheriff_pino  
Fecha de Ingreso: abril-2013
Ubicación: Córdoba
Mensajes: 118
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Consulta asesina

Algo que podría hacer sería crear un campo en la tabla clientes que fuera id_provincia, y que cada provincia tenga su ID correspondiente no?

Sé que lo que quiero es rizar el rizo, si hubiera una manera más fácil de hacerlo o otra manera de solucionarlo pues escucho y aprendo, no tiene que ser así obligatoriamente.

LA cuestión es queen los datos del cliente le aparezca su provincia como option selected, y la localidad(poblacion) igual. De manera que si hace una modificación en algún cmapo que no sean esos y clique en guardar, se mantengan esos resultados, pero que si desea cambiarlos, no tenga más que picar en la lista desplegable y elegir otra provincia, y luego otra poblacion.

Etiquetas: campo, join, mysql, select, sql, tabla
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




La zona horaria es GMT -6. Ahora son las 09:42.