AJAX - Problema en .done jQuery

   
Vista:

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 27/07/2015 15:54:10
Hola: Tengo un problema con el datatype: 'json' en una llamada Ajax
Tengo el siguiente script en donde #enviar es un boton de un formulario y add es el id del formulario.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script>
         $(function() {
 
 
            $("#enviar").click(function() { //Capturamos el evento click sobre el boton con el id Eviar
 
               $.ajax({
                  url: 'marcas_add.php',//Url a donde enviaremos los datos
                  type: 'post',// Tipo de envio
                  data:$(add).serialize(), //Serializamos el formulario
                  dataType: 'json' //Tipo de Respuesta
               })
 
               .done( function(response) { //Cuando nuestra función finalice, recuperamos la respuesta
 
                     alert( "done" ) ;
 
               });
 
               return false; // Evitar ejecutar el submit del formulario.
            });
         });
   </script>


No se porque el alert( "done" ); no se visualiza. De hecho tampoco puedo acceder el objeto response.
Si cambio el dataType a 'html' si se visualiza el alert, pero necesito que sea "json" para acceder al objeto de ese tipo.

El php ejecuta una consulta mysql pero a modo de prueba puse este código, pero sigo con el problema

1
2
3
4
5
6
$jsondata = array() ;
        $jsondata["estado"] =  "idvacio" ;
        $jsondata["mensaje"] = "Debe ingresar el numero de marca." ;
 
        header('Content-type: application/json; charset=utf-8');
        echo json_encode($jsondata, JSON_FORCE_OBJECT);


MUCHAS GRACIAS POR LA AYUDA.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Vainas

Problema en .done jQuery

Publicado por Vainas (71 intervenciones) el 27/07/2015 20:06:41
Buenas:

Asi como implementas done implementa tambien fail a ver si te lanza un mensaje:

1
2
3
fail(function() {
    alert( "error" );
  })

Puede que el error esta en el servidor. Tienes app en chrome (extensiones) como Advanced REST client o Postaman - Rest Client en el que puedes hacer una llamada al servidor con POST a ver si devuelve lo que tiene que devolver.

Espero que te ayude.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 27/07/2015 21:31:36
Hola Vainas, gracias por contestar. Efectivamente, inserte fail ( en realidad use .error) :
1
2
3
4
5
6
error: function(objeto, quepaso, otroobj) {
 
                            alert("1: " + objeto);
                            alert("2: " + quepaso);
                            alert("3: " + otroobj);
                }
(Tome el codigo de internet )
Los alerts me muestran lo siguiente:
1: [object Object]
2:parsererror
3:SyntaxError: JSON.parse: unexpected character at line 3 column 1 of the JSON data

En el head incluyo a jquery-1.11.2.min.js.

Entiendo que el JSON que "devuelve" el .php (en donde se usa json_encode) se estaría generando en forma errónea.

Gracias por tu valiosa ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Problema en .done jQuery

Publicado por xve (167 intervenciones) el 27/07/2015 20:47:04
Hola Javier, creo que lo tienes mal especificado... si add es el id del formulario tendría que ser así:
1
data:$("#add").serialize(), //Serializamos el formulario

Entiendo que enviar es el id del botón verdad?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 27/07/2015 22:57:03
Hola! Corregí ese error ( si, add es el id del formulario ), pero el problema continua.
El .php esta modificado de manera tal que no realiza la consulta, si no que genera un array y uso json_encode para crear el dato tipo json que se necesita devolver:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<body>
 
  <?php
 
 
     //$marcaid  = $_POST['marcaid'] ;
     //$marcades = utf8_decode ( Trim( $_POST['marcades'] ) );  
 
     $jsondata = array() ;
 
 
      $jsondata["estado"] = "existe" ;
      $jsondata["mensaje"] = "Debe ingresar el numero de marca." ;
 
 
      header('Content-type: application/json; charset=utf-8' );
 
 
 
     echo json_encode($jsondata , JSON_FORCE_OBJECT);
    ?>
 
</body>


No se si debería ir el código php en un tag <body>, porque tambien tiene <head > etc.
Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 27/07/2015 23:16:36
Vainas: Que bolos! Ya lo solucione quitando los tags htmls.
Hasta ahora todo marcha bien.
Gracias por tu ayuda y tu tiempo.
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 28/07/2015 04:04:25
Hola XVE! Plis, necesito saber porque vuelvo a tener el error de generacion del objeto JSON.
El error es : SyntaxError: JSON.parse: unexpected character at line 3 column 1 of the JSON data

Te copio el proceso completo del php. GRACIAS!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
     $jsondata = array();
 
     $marcaid  = $_POST['marcaid'] ;
     $marcades =$_POST['marcades'] ;
 
      if ( empty( $marcaid ) ||  empty( $marcades ) ) {
        if ( empty( $marcaid ) ) {
 
           $jsondata["estado"] = "empty" ;
           $jsondata["mensaje"] = "Debe ingresar el numero de marca." ;
 
        }
        else {
           if ( empty( $marcades ) ) {
 
              $jsondata["estado"] = "empty" ;
              $jsondata["mensaje"] = "Debe ingresar la descripcion." ;
 
           }
        }
     }
     else {
 
        $link=ConectarBD();
        $result=$link->query("select * from marcas where marcaid='$marcaid'");
        $link->close() ;
 
        if ( $result->num_rows > 0 ) {
 
           $jsondata["estado"] = "existe";
           $jsondata["mensaje"] = "EL NUMERO DE MARCA EXISTE.";
 
        }
        else {
 
           $result=$link->query("insert into marcas(marcaid,marcades ) values ('$marcaid','$marcades' )");
 
           $jsondata["estado"] = "no_existe";
           $jsondata["mensaje"] = "LA MARCA NO EXISTE";
 
        }
     }
 
     echo json_encode($jsondata, JSON_FORCE_OBJECT);
     return ;
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 28/07/2015 04:25:51
Perdon por insistir, con esta version de mi php no tengo errores en el control de marcaid y marcades. Pero si obtengo error cuando se hace la consulta y se genera el array en el if de num rows por verdadero o falso de ese if.
Lo que no entiendo es porque no dan error las lineas comentadas de la 4 a la 8 (obviamente ejecutado el php sin el comentario )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
     $jsondata = array();
 
     //$jsondata["estado"] = "estado_prueba" ;
     //$jsondata["mensaje"] = "mensaje_prueba" ;
     //header('Content-type: application/json; charset=utf-8' ); 
     //echo json_encode($jsondata , JSON_FORCE_OBJECT);
     //RETURN ;
 
     $marcaid  = $_POST['marcaid'] ;
     $marcades = utf8_decode ( Trim( $_POST['marcades'] ) );
 
     if ( empty( $marcaid ) ||  empty( $marcades ) ) {
        if ( empty( $marcaid ) ) {
 
           $jsondata["estado"] = "empty" ;
           $jsondata["mensaje"] = "Debe ingresar el numero de marca." ;
        }
        else {
           if ( empty( $marcades ) ) {
 
              $jsondata["estado"] = "empty" ;
              $jsondata["mensaje"] = "Debe ingresar la descripcion." ;
 
           }
        }
     }
     else {
 
        $link=ConectarBD();
        $result=$link->query("select * from marcas where marcaid='$marcaid'");
        $link->close() ;
 
        if ( $result->num_rows > 0 ) {
 
           $jsondata["estado"] = "existe";
           $jsondata["mensaje"] = "EL NUMERO DE MARCA EXISTE.";
        }
        else {
 
           $result=$link->query("insert into marcas(marcaid,marcades ) values ('$marcaid','$marcades' )");
 
           $jsondata["estado"] = "no_existe";
           $jsondata["mensaje"] = "LA MARCA NO EXISTE";
        }
     }
 
     header('Content-type: application/json; charset=utf-8');
     echo json_encode($jsondata, JSON_FORCE_OBJECT);
     return ;
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas

Problema en .done jQuery

Publicado por Vainas (71 intervenciones) el 28/07/2015 07:41:32
Buenas de nuevo:

Todo el error lo tienes en el php ya que parece ser que jQuery con ajax cumple su trabajo. Hazme caso y pasate a usar las extensiones que te digo que te daran una ayuda.

Algo que pueda ser lo que se sucede (hipotesis mias): cuando envias un header("...") tiene que ir antes de cualquier envio de nada al cliente, y cuando digo nada me refiero a que no debes enviar etiquetas html antes del header y tampoco espacios en blanco. Esto ultimo vigila que arriba del todo en tu php no exista espacios antes de <?php.

Antes del header ningun "echo".

Puede que venga por algo de esto.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 29/07/2015 20:50:16
Hola. Gracias por responder!
El problema tenia una solucion de lo mas simple. Al hacer la consulta no tenia hecha la conexion a la base de datos. Mil disculpas y gracias por tu tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 29/07/2015 21:22:33
De paso queria molestarte y consultarte lo siguiente:

- Tengo un <table> que muestra el resultado de una consulta mysql.

- En cada fila tengo una columna con una imagen de enlace a una ventana modal (bootstrap) para realizar la edición del registro. Cada fila de la table tien un link definido usando data-id=". $row['codigo'] . " data-des=". $row["descripcion'] etc. Cada fila a su vez tiene el id='btn_modifica_tabla':

1
2
echo "<td> <a data-toggle='modal' data-id=".$row['marcaid' ]." data-des=".$row['marcades' ].
                                                  " id='btn_modifica_tabla' href='#win_modifica'>";


- Para capturar los datos del registro, capturo el click de este id 'modifica' en una funcion Js, tomo los valores de los data- y los asigno a los input que tengo en un formulario en la ventana modal, empleando los id de estos input.
1
2
3
4
5
6
7
8
9
10
11
12
<script>
       $(document).on("click", "#btn_modifica_tabla", function () {
 
          var dato1  = $(this).data("id");
          var dato2  = $(this).data("des");
 
          $('#win_modifica #marcaold').val( dato1 ) ;
          $('#win_modifica #m_marcaid').val( dato1 ) ;
          $('#win_modifica #m_marcades').val( dato2 ) ;
 
      });
   </script>


- Para procesar los datos cargados en los input, el evento click del boton "Aceptar" del formulario es capturado en otra funcion Js
que serializa los datos del form y hace una petición Ajax para validar los datos, insertar los datos en la tabla y devolver un objeto json que luego uso para ver que camino toma el procedimiento (este codigo sería el de mi ultimo posteo).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<script>
          $(function() {
            $("#btn_modifica").click(function() {
 
               $.ajax({
                  url: 'marcas_mod.php',//Url a donde enviaremos los datos
                  type: 'POST',// Tipo de envio
                  dataType: 'json', //Tipo de Respuesta
                  data:$("#form_modifica").serialize(), //Serializamos el formulario
 
                  success: function(response) {//Cuando nuestra función finalice, recuperamos la respuesta
 
                     $("#respuesta1").html(response.mensaje) ;
 
                     if ( response.estado == "ok" ) {
                        $('#win_modifica').modal('hide');
                        location.reload();
                     }
                  },
 
                  error: function(objeto, quepaso, otroobj) {
                         //alert("ERROR!");
                         //alert("1.." + objeto);
                         //alert("2.." + quepaso);
                         alert("3.." + otroobj);
                  }
 
               })
 
               return false; // Evitar ejecutar el submit del formulario.
 
            });
       });
 
 
   </script>


Luego de varias horas de prueba , puedo decir que funciona bien este proceso.

La pregunta es: existe otra forma de hacerlo?

Voy a intentar aplicar las extensiones que me propones.

Nuevamente gracias!
Javier
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas

Problema en .done jQuery

Publicado por Vainas (71 intervenciones) el 30/07/2015 09:47:47
Buenas:

Para mis conocimientos (hasta donde llego) creo que esta bastante organizado y bien realizado todos los pasos (ademas de bien explicado, con esto te montas algun tutorial).

Temas a tener en cuenta: los id's en un html no se puede repetir. Si quieres asignar la misma funcion a un boton por ejemplo, usa clases (aunque la clase no tenga css). Yo cambiaria id por class y ya lo tienes (la llamada de jquery a una class es con un punto (.) en vez de con esto #.

Igual es meterte en mucho si ya funciona, pero podrias en un futuro intentar que lo que se envia fuera tambien json, pero esto te obligaria a cambiar muchas cosas en php.

En php puedes trabajar con algun Framework MVC....

Las extensiones que te pase lo que te ayudan es a ver si independientemente la parte del server funciona sin tu parte cliente. Reduces mucho donde tienes que buscar fallos.

Por ultimo piensa por que haces un location.reload(); si a lo mejor podrias actualizar los datos de la tabla por ejemplo y asi no recargas la pagina.

Piensa siempre en como viajan los datos de cliente a servidor para ver que puedes optimizar. En cuanto a tu codigo si quitas mas no hace lo que tiene que hacer!!!

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier javieralbornoz@msn.com (11 intervenciones) el 03/08/2015 22:38:35
Hola! Gracias por tu comentario y sugerencias. Sigo con las preguntitas!
1) Que mejoras obtendría al enviarle un json al php ?

2) Cuando dices Framework no se bien a que te refieres. Podras darme el nombre de alguno, a lo mejor ya uso uno y no tengo ni idea jaja. Angular JS es un framework? (no lo uso, pero parece poderoso ). Perdon por mi ignorancia.

3) Me quedé en lo de mejorar lo del reload asi que busque y encontre un data grid muy bueno ( a mi modesto entender) que se llama jQGrid. Ahora estoy viendo si puedo compatabilizar esa librería con lo que ya tenía desarrollado. Aunque jQGrid permite agregar, editar y eliminar registros.

4) Estoy usando la extension HTTP Request para FF. Ya me saco de algun apuro (creo). Aunque me falta un monton para entender como funciona e interpretar sus resultados.

Gracias por estar en contacto.
Podria conocer tu email? El mio lo publico arriba,
Saludos.
Javier
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas

Problema en .done jQuery

Publicado por Vainas (71 intervenciones) el 06/08/2015 20:18:46
Buenas. Ya siento responder tarde pero uno tambien tiene derecho a tomarse unas vacaciones no?

1) Que mejoras obtendría al enviarle un json al php ?

Yo creo que basicamente es que envias menos datos y son muchos mas claros. No es lo mismo enviar:

1
2
3
4
5
6
7
<xml>
<opciones>
<opcion1></opcion1>
<opcion2></opcion1>
<opcion2></opcion1>
</opciones>
</xml>

que:

1
xml: [{opciones: {opcion1: "", opcion2: ""}}] // o algo asi.

Lo malo es tener que manejar las entradas de json en el servidor mediante php ya que de momento no es muy "estandar" y tienes que hacer uso de la entrada de datos en crudo del lenguaje. Algo asi como:

1
2
$json = file_get_contents('php://input');
$obj = json_decode($json, TRUE);

Pero en realidad es a gustos lo que te comento. Otra cosa que se me ocurre es que de cara a trabajar algo mas organizado podrias pensar en unificar entradas y salidas todo en json y no estar pensando que si una va en tal formato, la otra en otro... y asi.

2) Cuando dices Framework no se bien a que te refieres. Podras darme el nombre de alguno, a lo mejor ya uso uno y no tengo ni idea jaja. Angular JS es un framework? (no lo uso, pero parece poderoso ). Perdon por mi ignorancia.

No hay que pedir disculpas por la ignorancia ya que todos somos ignorantes en algun momento de nuestras vidas. Si que conoces seguramente o has escuchado a hablar de ellos (tu mismo ya nombras angularjs). De cara al cliente y en javascript tienes angularjs, backbone entre otros. Otra cosa son librerias como jquery. Piensa que un framework como algo que te organiza para que hagas las cosas sobre un problema que hemos tenido todos.

Del lado del servidor en php tienes otros como Laravel, Symfony...CakePHP.. aqui te puedo dar un ejemplo mas claro de que es un framework. Cual es el problema a la hora de diseñar algo en php? pues que empiezas a crear archivos php sin conocimiento sobre lo que tu piensas que son funcionalidades... al final tienes codigo repetido mal organizado... seguramente un caos. Que hace un framework, pues dice: voy a crear por un lado lo que se conecta a la bbdd, por otro las funcionalidades que va a recibir lo que manda el cliente y por otro voy a procesar lo que le voy a mostrar. Se separan para intentar tener todo mas organizado. Es un poco dificil de explicar y seguro que no soy bueno pero bueno aqui te dejo mi forma de explicarlo. Como en javascript, otra cosa son librerias, como las usadas para crear un pdf o enviar un correo por ejemplo.

3) Me quedé en lo de mejorar lo del reload asi que busque y encontre un data grid muy bueno ( a mi modesto entender) que se llama jQGrid. Ahora estoy viendo si puedo compatabilizar esa librería con lo que ya tenía desarrollado. Aunque jQGrid permite agregar, editar y eliminar registros.

Seguramente lo que has conseguido (la libreria que comentas) tiene ya implementado todas las funcionalidades que has ido creando tu para tu proyecto. Posiblemente la necesites o no pero me es muy dificil de valorar sin saber si tienes que usar por ejemplo esas funcionalidades para mas areas del proyecto y aun no las tenga implementadas... de todas formas siempre es bueno usar las librerias si vas a usar muchas de sus funcionalidades ya que eliminas tener que programarlas de nuevo (lo de reinventar la rueda...).

Sobre lo del reload yo a lo que iba es a lo siguiente. Tu app hace algo asi

El cliente envia una peticion de la web.
El servidor se la envia.
El cliente procesa unos datos y los envia por ajax.
El servidor los recibe y se envia un "ok" o "error".
El cliente recarga la web entera si obtiene un "ok".

A la hora de ahorrarte pasar datos entre ellos por que no aprovechas ya que envias un "ok" y le envias por ejemplo la modificacion que se ha hecho en la tabla y haces la actualizacion de la misma en el cliente. Es decir. Envias un "ok" y ademas lo que se ha modificado. ahora implementas un update que actualice la fila que corresponde. No es lo mismo que decirle al cliente: "y ahora recargas de nuevo toda la pagina..." Vale que me puedes decir que tu cliente le da igual y no lo notara pero si pensamos en que el cliente ve la web en un telefono movil y se esta gastando los datos.... Yo creo que nos pagan por estas cosas, pero sigue siendo una funcionalidad que si de momento valores que no es necesario cambiarla es a gustos como todo. Si funciona no lo toques.

4) Estoy usando la extension HTTP Request para FF. Ya me saco de algun apuro (creo). Aunque me falta un monton para entender como funciona e interpretar sus resultados.

No son dificiles de usar. Si quieres que te mande deberes te digo que te estudies el protocolo HTTP y asi entenderas muchas cosas de ese tipo de herramientas... piensa que programas para web y es algo que tambien deberias saber.

Escribeme en el foro si tienes alguna duda. Tambien al correo del foro si quieres algo mas personal no tengo problemas de momento (no soy un hombre tan solicitado). Si quieres ayuda mas personal entenderas que fuera de aqui programo para comer pero proponme algo e igual programamos los dos para vivir.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema en .done jQuery

Publicado por Javier (11 intervenciones) el 13/08/2015 13:24:15
Hola! Muchas gracias por tus aportes! Realmente clarisimos.
hasta pronto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar