Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Autocompletar form con info de DB

Estas en el tema de Autocompletar form con info de DB en el foro de PHP en Foros del Web. Hola a todos! Estoy teniendo un problema con este formulario. Básicamente es una parte de un formulario más grande pero en esta parte en concreto ...
  #1 (permalink)  
Antiguo 28/09/2014, 10:12
 
Fecha de Ingreso: septiembre-2014
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Exclamación Autocompletar form con info de DB



Hola a todos! Estoy teniendo un problema con este formulario. Básicamente es una parte de un formulario más grande pero en esta parte en concreto es para introducir la dirección del cliente. Tengo una base de datos con los códigos postales y las poblaciones de España, lo que me gustaría hacer es que al escribir un código postal y dar click al botón "Buscar" se autorellenen los campos "Población" y "Provincia" con la información de la base de datos (O lo mismo pero autocompletando "Código Postal" si se escribe el nombre de la población).

Al ser parte de un form más grande se tiene que activar el botón buscar con un evento OnClick o bien eliminar el botón y usar un evento OnChange.

Y ahí estoy atascado, no se como seguir. ¿Debería invocar un segundo archivo PHP y luego actualizar el form con los datos de la DB? ¿Podría usar la función autocomplete de jQuery? Agradezco cualquier ayuda, gracias de antemano!
  #2 (permalink)  
Antiguo 28/09/2014, 11:11
 
Fecha de Ingreso: septiembre-2014
Mensajes: 79
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Autocompletar form con info de DB

Código PHP:
Ver original
  1. <?
  2. <form action="" method="post">
  3. <input type="text"  name="codigo_postal" value="" />
  4. <input type="submit" name="enviar" value="enviar"/>
  5. </form>
  6. <?
  7. $r=  mysql_query("SELECT * FROM tabla WHERE codigo postal=".$_POST["codigo_postal"].";",$conexion);
  8. $resultado_r= mysql_fetch_array($r);
  9. ?>
  10. <input type="text" name="cuidad" value="<? echo $resultado_r["provincia"]?>"/>
Hola, es eso lo que necesitas? Saludos.
  #3 (permalink)  
Antiguo 28/09/2014, 11:43
 
Fecha de Ingreso: septiembre-2014
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Autocompletar form con info de DB

No exactamente. La parte de la dirección es sólo una parte del form, por lo que esto no funcionaría. Digamos que (aunque con HTML no se pueda) la parte de la dirección sería un form dentro de otro form más grande. Lo que necesito es que al insertar la información del usuario, al llegar a la parte de la dirección, cuando se escriba el código postal y se pulse el botón buscar se realice una consulta a la BD y con la información que se obtenga se rellenen los campos población y código postal del formulario (pero sin llegar a mandar el formulario).
  #4 (permalink)  
Antiguo 28/09/2014, 12:21
Avatar de jesus1975  
Fecha de Ingreso: febrero-2012
Ubicación: Valencia
Mensajes: 54
Antigüedad: 12 años, 2 meses
Puntos: 3
Respuesta: Autocompletar form con info de DB

Buena, creo que lo que necesitas es utilizar ajax, seria que una vez introdujeran el numero de codigo postal el campo de poblacion hiciera una busqueda para encontar la poblacion con ese codigo postal y la mostrara (todo eso sin refrescar la pagina)...
Te dejo el link que me ha ayudado en varias ocasiones para hacer esto:

http://www.formatoweb.com.ar/ajax/se...pendientes.php
__________________
Nuevo portal de anuncios http://www.aquituanuncio.com
  #5 (permalink)  
Antiguo 30/09/2014, 04:23
 
Fecha de Ingreso: septiembre-2014
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Autocompletar form con info de DB

Vale, he conseguido hacerlo funcionar aunque no funciona exactamente como me gustaría. Lo primero no consigo hacer que al dar al botón se rellenen los campos, he tenido que hacerlo con el método OnBlur. ¿Cómo podría hacer que al dar al botón Buscar se rellenen los campos (en vez de usar OnBlur)?

FORMS
Código PHP:
<input type="text" maxlength="5" onblur="updateCityState();" id="postal_code" name="postal_code" placeholder="Código postal" pattern="[0-9]{5}">
<
button class="btn btn-info btn-flat" type="submit">Buscar</button>
<
input type="text" id="city" placeholder="Población">
<
button class="btn btn-info btn-flat" type="button">Buscar</button>
<
input type="text" id="state" class="form-control" placeholder="Provincia"
AJAX
Código PHP:
var ajax getHTTPObject();

            function 
getHTTPObject()
            {
                var 
xmlhttp;
                if (
window.XMLHttpRequest) {
                  
// code for IE7+, Firefox, Chrome, Opera, Safari
                  
xmlhttp=new XMLHttpRequest();
                } else if (
window.ActiveXObject) {
                  
// code for IE6, IE5
                  
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                } else {
                  
//alert("Your browser does not support XMLHTTP!");
                
}
                return 
xmlhttp;
            }

            function 
updateCityState()
            {
                if (
ajax)
                {
                    var 
zipValue document.getElementById("postal_code").value;
                    if(
zipValue)
                    {
                        var 
url "get_cities.php";
                        var 
param "?postal_code=" escape(zipValue);

                        
ajax.open("GET"url paramtrue);
                        
ajax.onreadystatechange handleAjax;
                        
ajax.send(null);
                    }
                }
            }
            function 
handleAjax()
            {
                if (
ajax.readyState == 4)
                {
                    
citystatearr ajax.responseText.split(",");

                    var 
city document.getElementById('city');
                    var 
state document.getElementById('state');

                    
city.value citystatearr[0];
                    
state.value citystatearr[1];
                }
            } 
CONSULTA BD
Código PHP:
<?php
include_once('../../../connect.html');
//perform lookup
$title = ($_GET['postal_code']);
$statement $connection->prepare ("SELECT city, state FROM cities, states WHERE cities.state_id = states.state_id AND cities.postal_code = ?");
$statement->execute(array($title));
$statement->setFetchMode(PDO::FETCH_BOTH);

//print out results
while($r $statement->fetch()){
  echo 
$r['city'].",".$r['state'];
}
Por otra parte tengo un error. Si escribo un código postal válido funciona, pero si escribo uno que no existe me saca un "undefined" en ambos campos. ¿Como podría hacer que al intriducir un código postal que no existe se rellenen los campos con algo como "El código postal no existe?. He intentado solucionarlo tocando un poco la parte de "echo..." de la consulta a la DB, probando con un if else pero no doy con ello. ¿Alguna sugerencia?
  #6 (permalink)  
Antiguo 30/09/2014, 05:22
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Autocompletar form con info de DB

Buenas, ¿utilizas jQuery? Si es así, es algo más sencillo, de mientras...

Aqui, tienes
Código Javascript:
Ver original
  1. citystatearr = ajax.responseText.split(",");
  2.  
  3. city.value = citystatearr[0];
  4. state.value = citystatearr[1];

Puedes poner algo así como

Código Javascript:
Ver original
  1. if( ajax.responseText.length ) {
  2.     citystatearr = ajax.responseText.split(",");
  3.  
  4.     city.value = citystatearr[0];
  5.     state.value = citystatearr[1];
  6. }
  7. else {
  8.     //Lo que quieras si no encuentra el codigo postal
  9. }

Así controlas los undefined (que viene a ser, que citystatearr no es un array, pq no existe respuesta!).



Sobre el onclick, solo tienes que ejecutar la función updateCityState();
__________________
>> Eleazan's Source
>> @Eleazan
  #7 (permalink)  
Antiguo 02/10/2014, 07:02
 
Fecha de Ingreso: septiembre-2014
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Autocompletar form con info de DB

Funciona todo perfecto, muchas gracias. Lo único es que he tenido que cambiar el input type del botón a "button".
  #8 (permalink)  
Antiguo 02/10/2014, 07:34
 
Fecha de Ingreso: septiembre-2014
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Autocompletar form con info de DB

Vale, acabo de darme cuenta de que falta por solucionar un error bastante importante... Hay códigos portales que pertenecen a más de una población. Al introducir esos códigos postales da el primer resultado del array. ¿Habría alguna manera de hacer que cuando se introduzca uno de estos códigos postales se abra una nueva ventana con un select para elegir la población correcta y reenviar esa info de vuelta al formulario?

Esto cada vez se me complica más...
  #9 (permalink)  
Antiguo 02/10/2014, 07:46
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Autocompletar form con info de DB

Simplemente, déjales cambiar la población xD
__________________
>> Eleazan's Source
>> @Eleazan
  #10 (permalink)  
Antiguo 04/10/2014, 14:51
 
Fecha de Ingreso: septiembre-2014
Mensajes: 6
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Autocompletar form con info de DB

Vale, he conseguido hacer parte de lo que quería, pero ahora me encuentro con otro error. He conseguido detectar que al dar al botón buscar se haga el query a la DB y tengo tres supuestos:
  1. El código postal no existe -> Arroja un mensaje de error
  2. El código postal existe y solo es usado por una población -> Rellena el form con la info de la DB.
  3. El código postal existe pero más de una poblaión lo usa -> Abre un popup para seleccionar la localidad correcta.

Los dos primeros supuestos funcionan perfectamente. Con el tercero he conseguido hacer que el script detecte que el código postal está compartido por más de una persona pero en vez de abrir el popup inserta la información de este en el form. (Ver imagen) Voy a actualizar el post principal con el código que estoy usando.



Edit: No puedo actualizar el post principal asique lo pongo aquí:

index.php

Código PHP:
<input type="text" maxlength="5" class="form-control" id="postal_code" name="postal_code" placeholder="Código postal" pattern="[0-9]{5}">
<
button class="btn btn-info btn-flat" type="button" onclick="updateCityState();">Buscar</button>
<
input type="text" id="city" class="form-control" placeholder="Población">
<
input type="text" id="state" class="form-control" placeholder="Provincia">
........
<
script src="popup.js"></script>
<script>var ajax = getHTTPObject();

        function getHTTPObject()
        {
            var xmlhttp;
            if (window.XMLHttpRequest) {
              // code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp=new XMLHttpRequest();
            } else if (window.ActiveXObject) {
              // code for IE6, IE5
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            } else {
              //alert("Your browser does not support XMLHTTP!");
            }
            return xmlhttp;
        }

        function updateCityState()
        {
            if (ajax)
            {
                var zipValue = document.getElementById("postal_code").value;
                if(zipValue)
                {
                    var url = "get_cities.php";
                    var param = "?postal_code=" + escape(zipValue);

                    ajax.open("GET", url + param, true);
                    ajax.onreadystatechange = handleAjax;
                    ajax.send(null);
                }
            }
        }
        function handleAjax()
        {
            if (ajax.readyState == 4)
            {
                if( ajax.responseText.length ) {
                    citystatearr = ajax.responseText.split(",");
                    city.value = citystatearr[0]; 
                    state.value = citystatearr[1];
                }else{
                    city.value = "No existe";
                    state.value = "No existe";
                }
            }
        }
    </script> 
get_cities.php

Código PHP:
<?php
include_once('../../../connect.html');
//perform lookup
$title = ($_GET['postal_code']);
$statement $connection->prepare ("SELECT city, state FROM cities, states WHERE cities.state_id = states.state_id AND cities.postal_code = ?");
$statement->execute(array($title));
$statement->setFetchMode(PDO::FETCH_ASSOC);

//print out results

//print_r($r);
//if (count($r)>4) {
//        echo "Muchos","Demasiados";
//    }else{

$items = array();
while (
$r $statement->fetch()) {
    
//$arrayName = array($r = $statement->fetch());
    
$items[] = $r;
}

if (
count($items) == '1'){

    
$newArray $items[0];
    echo 
$newArray['city'].",".$newArray['state']; 
}elseif (
count($items) == '0'){
        echo 
"Doesn't exist".","."Doesn't exist";
    }else{
?>
<script type="text/javascript">
centerPopup();
        loadPopup();
</script>

        <div id="popupContact">
        <a id="popupContactClose">x</a>
        <h1>Title of our cool popup, yay!</h1>
        <p id="contactArea">
            Here we have a simple but interesting sample of our new stuning and smooth popup. As you can see jQuery and CSS does it easy...
            <br/><br/>
            We can use it for popup-forms and more... just experiment!
            <br/><br/>
            Press ESCAPE, Click on X (right-top) or Click Out from the popup to close the popup!
            <br/><br/>
            <a href="http://www.yensdesign.com"><img src="logo.jpg" alt="Go to yensdesign.com"/></a>
        </p>
    </div>
    <div id="backgroundPopup"></div>
    <?php
}

?>
popup.js
Código PHP:
/***************************/
//@Author: Adrian "yEnS" Mato Gondelle
//@website: www.yensdesign.com
//@email: [email protected]
//@license: Feel free to use it, but keep this credits please!                  
/***************************/

//SETTING UP OUR POPUP
//0 means disabled; 1 means enabled;
var popupStatus 0;

//loading popup with jQuery magic!
function loadPopup(){
    
//loads popup only if it is disabled
    
if(popupStatus==0){
        $(
"#backgroundPopup").css({
            
"opacity""0.7"
        
});
        $(
"#backgroundPopup").fadeIn("slow");
        $(
"#popupContact").fadeIn("slow");
        
popupStatus 1;
    }
}

//disabling popup with jQuery magic!
function disablePopup(){
    
//disables popup only if it is enabled
    
if(popupStatus==1){
        $(
"#backgroundPopup").fadeOut("slow");
        $(
"#popupContact").fadeOut("slow");
        
popupStatus 0;
    }
}

//centering popup
function centerPopup(){
    
//request data for centering
    
var windowWidth document.documentElement.clientWidth;
    var 
windowHeight document.documentElement.clientHeight;
    var 
popupHeight = $("#popupContact").height();
    var 
popupWidth = $("#popupContact").width();
    
//centering
    
$("#popupContact").css({
        
"position""absolute",
        
"top"windowHeight/2-popupHeight/2,
        
"left"windowWidth/2-popupWidth/2
    
});
    
//only need force for IE6

    
$("#backgroundPopup").css({
        
"height"windowHeight
    
});

}


//CONTROLLING EVENTS IN jQuery
$(document).ready(function(){

    
//LOADING POPUP
    //Click the button event!


    //CLOSING POPUP
    //Click the x event!
    
$("#popupContactClose").click(function(){
        
disablePopup();
    });
    
//Click out event!
    
$("#backgroundPopup").click(function(){
        
disablePopup();
    });
    
//Press Escape event!
    
$(document).keypress(function(e){
        if(
e.keyCode==27 && popupStatus==1){
            
disablePopup();
        }
    });

}); 
Básicamente esto se inserta en el form en vez de ejecutar el código... ¿alguna idea de por qué?

Última edición por darktests; 04/10/2014 a las 14:56

Etiquetas: form, mysql
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 11:35.