1

Un saludo amigos, actualmente estoy resolviendo un ejercicio en el cual quiero hacer una consulta sin necesidad de recargar la pagina, por tal motivo estoy usando ajax... Pero llevo ya varias horas y nada que doy con la solucion, e mirado algunos ejemplos que hay por internet pero ni asi e logrado resolverlo.

El problema es que el navegador no me da ningún error, si no que se queda colgado ejecutando la consulta y debo cerrar la pestaña para que vuelva a la normalidad.

Lo que quiero hacer es insertar un numero de cédula y al dar click en un boton compruebe si existe en mi base de datos, si existe me debe traer unos valores que se asignaran en varios cuadros de texto

Este es el código que tengo en el head de la pagina

<script type="text/javascript" src="../js/jquery-2.2.4.js"></script>
    <script type="text/javascript">

        $(document).ready(function(){

            // Asigno un evento a un botón de mi formulario

            $("[name='buscar_cli']").click(function(e){

                e.preventDefault();

                var datos_enviados = {
                    'buscar_cli' : $("[name='ced_cli']")
                }

                $.ajax({
                    type:'POST',
                    url: 'bd_comun.php',
                    data: datos_enviados,
                    datatype: 'json',
                })

                // Compruebo si me esta trayendo los valores

                .done(function(data){

                    console.log(data);
                    var datos2 = JSON.parse(data);
                    console.log(datos2);

                })

            })

        })

    </script>

Envio la cedula a un script php

if(isset($_POST['buscar_cli'])){

$persona = new usuario();
    $valor = $persona->buscarCliente($_POST['buscar_cli']);
}

Por ultimo envió los datos a otro script php para realizar la consulta

public function buscarCliente($ced){

    $buscar = "SELECT COUNT(*) FROM registro_clientes WHERE rc_cedu=:a";
    $resultado = $this->db_conexion->prepare($buscar);
    $resultado->execute(array(':a'=>$ced));

    $filas = $resultado->fetchColumn();

    if($filas>0){

        $extraer = "SELECT rc_cedu,rc_nomb,rc_aped,rc_telf,rc_dire FROM registro_clientes WHERE rc_cedu=:a";
        $resultado2 = $this->db_conexion->prepare($extraer);
        $resultado2->execute(array(':a'=>$ced));

        $data["datos"][] = $resultado2->fech(PDO::FETCH_ASSOC);

        echo json_encode($data);
        $resultado2->closeCursor();
    }else{
        echo 'Error';
    }

    $resultado->closeCursor();
    $this->db_conexion = null;
}

Eso es lo que tengo amigos, comento que mi experiencia con ajax es nula. Si me pueden echar una mano se los agradecería, ya he modificado varias veces el ejercicio pero no consigo hacerlo funcionar :(

Rafael Bautista
  • 2,603
  • 6
  • 20
  • 35
  • Agrega la función `.fail()` de jQuery para obtener los fallos ocasionado a la solicitud... [aquí](https://stackoverflow.com/a/14563181/2097224) tienes un ejemplo – Black Sheep Nov 16 '17 at 10:21
  • Ya la agregue pero igual cuando doy click al boton se queda colgada la pagina... Es como si estuviera realizando mal la consulta, podrias decirme porfavor si vez algun fallo en el codigo? – Kevin Melendez Nov 16 '17 at 10:52
  • Tienes un error tipográfico.. te falta una `t` en `$resultado2->fech(...)` y debería ser `$resultado2->fetch(...)` – Black Sheep Nov 16 '17 at 10:54
  • El Ajax parece correcto, salvo la omisión de `fail`que ya agregaste. Revisa lo que te dice @aldanux del error ortográfico en el `fetch`... También tienes un error lógico en tu PHP. Si la llamada a Ajax espera un JSON, **tu PHP debe responder siempre un JSON**, por eso, lo correcto sería ir controlando el código PHP e ir recogiendo los resultados en un solo array y al final imprimir ese array. Si tú cuando el código falla haces un `echo "Error";` no estás escribiendo un código coherente con lo que espera la petición Ajax. [He explicado eso aquí](https://es.stackoverflow.com/a/103252/29967) – A. Cedano Nov 16 '17 at 11:51

1 Answers1

0

Prueba de este modo. He aplicado algunas cosas dichas en comentario.

jQuery

  • He usado código actualizado de jQuery (document.ready está obsoleto).
  • He agregado el fail.
  • Si respondes adecuadamente en el servidor no necesitas parsear el JSON luego.

    $(function() {
    
        // Asigno un evento a un botón de mi formulario
    
        $("[name='buscar_cli']").click(function(e){
    
            e.preventDefault();
    
            var datos_enviados = {
                'buscar_cli' : $("[name='ced_cli']")
            }
    
    
        var request = $.ajax({
          url: "bd_comun.php",
          method: "POST",
          data: datos_enviados,
          dataType: "json"
        });
    
    
        request.done(function( data ) {
            alert("Todo bien");
            console.log(data); //Si pones el content-type en PHP no necesitas parse         
        });
    
        request.fail(function( jqXHR, textStatus ) {
          alert( "Hubo un error: " + textStatus );
        });
    
    
        })
    
    });
    

PHP

  • El código tiene algunos problemas. Entre ellos que no es coherente. Si Ajax espera un json, que fue lo que indicaste en el dataType, no es buena práctica hacer un simple echo si hay un error. Debes recoger en una variable el resultado del código e imprimirlo al final como json, pues eso es lo que Ajax espera.
  • En PDO tienes que usar fetchAll y no fetch si quieres todos los resultados en un arreglo, de golpe. fetch es para ir iterando en un bucle. Ignora esto. El comentario de @aldanux me ha hecho ver que con fetch puedes en efecto almacenar una fila completa en un array de resultados. Si fuera más de una fila (y no son muchas filas), puedes entonces usar fetchAll.
  • No le veo mucha lógica al uso de dos consultas, primero una para contar y luego otra para obtener los datos. Creo que se podría hacer con una sola, pero eso queda a opción tuya.

Espero te sirva.

public function buscarCliente($ced){

    $buscar = "SELECT COUNT(*) FROM registro_clientes WHERE rc_cedu=:a";
    $resultado = $this->db_conexion->prepare($buscar);
    $resultado->execute(array(':a'=>$ced));

    $filas = $resultado->fetchColumn();

    if($filas>0){

        $extraer = "SELECT rc_cedu,rc_nomb,rc_aped,rc_telf,rc_dire FROM registro_clientes WHERE rc_cedu=:a";
        $resultado2 = $this->db_conexion->prepare($extraer);
        $resultado2->execute(array(':a'=>$ced));

        $arrResultado["datos"][] = $resultado2->fetch(PDO::FETCH_ASSOC);

        $resultado2->closeCursor();
    }else{
        $arrResultado=array("error"=>"No se encontraron datos");
    }

    $resultado->closeCursor();
    $this->db_conexion = null;

        header('Content-Type: application/json');
        echo json_encode($arrResultado);

 }
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Muchas gracias por detallada respuesta hermano, me aclare un poco mas en lo que a json se refiere. Ya hice las respectivas correcciones al código, pero la pagina se queda congelada cuando doy en el botón buscar. El código sin la instrucción ajax funciona perfecto, incluso puedo trabajarlo con php para realizar la consulta; pero lo quiero hacer sin recargar la pagina... Por eso la necesidad de hacerlo con ajax. Respecto a las consultas lo hago de esa manera ya que debe arrojar una sola fila de datos, si no la arroja es porque la cedula no existe y no tendria necesidad de tomar los otros valores – Kevin Melendez Nov 16 '17 at 18:22
  • Abra algún error en tratar de utilizar 2 scripts php? ya que primero lo envió a este script... if (isset($_POST['buscar_cli'])) { $persona = new usuario(); $valor = $persona->buscarCliente($_POST['buscar_cli']); } luego como se observa paso el valor a la función que esta en otro script por medio de parámetros, y desde la otra función es que retorno el json, tal como detalle en la pregunta... – Kevin Melendez Nov 16 '17 at 18:33
  • No es que sea otro script @KevinMelendez, o no debería serlo, a no ser que no tengas las cosas como deben ser. Lo que tú haces aquí `$persona = new usuario();` es **crear una instancia de una clase llamada `usuario`** (que es un archivo PHP eso sí), la cual **tiene un método llamado `buscarCliente`**, que luego invocas de esta manera: `$valor = $persona->buscarCliente($_POST['buscar_cli']);` ¿Estamos de acuerdo en eso o no? – A. Cedano Nov 16 '17 at 18:51
  • Exacto, tengo un archivo php llamado "bd_comun" en el cual recibo los valores de mi formulario y desde hay instancio la clase usuario para luego acceder a las funciones que tengo en otro archivo php llamado "bd_funciones"... Respecto a la instrucción $valor = $persona->buscarCliente($_POST['buscar_cli']); creo que no es necesario utilizar una variable sino simplemente ejecutar la instrucción $persona->buscarCliente($_POST['buscar_cli']); – Kevin Melendez Nov 16 '17 at 19:34
  • Ya logre solucionarlo ^_^ resulta que no estaba enviando correctamente el valor del input... Estaba pasando esto 'buscar_cli' : $("[name='ced_cli']"), cuando lo que debía pasar era esto 'buscar_cli' : $("[name='ced_cli']").val()... Muchas gracias por todo hermano, aveces es algo simple pero cuesta hallar el causante del error jejeje... Saludos y que Dios te Bendiga – Kevin Melendez Nov 16 '17 at 22:11
  • Me alegro de que la respuesta te haya ayudado a resolver el problema. Por favor lee: **[¿Qué debo hacer cuando alguien contesta mi pregunta?](https://es.stackoverflow.com/help/someone-answers)**. Recibe un cordial saludo y muchas bendiciones también para ti. – A. Cedano Nov 16 '17 at 22:12