Foros del Web » Programando para Internet » Javascript »

A vueltas con el Ajax

Estas en el tema de A vueltas con el Ajax en el foro de Javascript en Foros del Web. Buenos días. Estoy intentando ponerme al día con ajax, pero me cuesta aún la interacción entre este y php: El ejemplo es muy sencillito y ...
  #1 (permalink)  
Antiguo 25/04/2014, 04:34
Avatar de replica  
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 19 años, 6 meses
Puntos: 2
A vueltas con el Ajax

Buenos días.

Estoy intentando ponerme al día con ajax, pero me cuesta aún la interacción entre este y php:

El ejemplo es muy sencillito y corto. Intento adivinar un número que debería generarme php de manera aleatoria (ya sé que este ejemplo se podría hacer totalmente con javascript, pero, como digo, intento descubrir los misterios del ajax).

Archivo Adivina.html
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2.     <head>
  3.         <meta charset="UTF-8" />
  4.         <title>Adivina el número</title>
  5.         <script type="text/javascript" src="ajax.js" defer></script>
  6.         <script type="text/javascript" src="codigo.js" defer></script>
  7.     </head>
  8.     <body>
  9.         <input type="number" name="numero" id="numero" />
  10.         <input type="button" id="boton" value="Inténtalo!" />
  11.  
  12.         <p id="resultado"></p>
  13.     </body>
  14. </html>

Archivo ajax.js
Código Javascript:
Ver original
  1. var peticion_http;
  2.  
  3.             function cargaContenido(url, metodo, parametro, funcion) {
  4.                 peticion_http = inicializa_xhr();
  5.  
  6.                 if(peticion_http) {
  7.                 peticion_http.onreadystatechange = funcion;
  8.                 peticion_http.open(metodo, url, true);
  9.                 peticion_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  10.                 peticion_http.send(parametro);
  11.                 //peticion_http.responseText;
  12.                 }
  13.             }
  14.  
  15.             function inicializa_xhr() {
  16.                 if(window.XMLHttpRequest) {
  17.                 return new XMLHttpRequest();
  18.                 }
  19.             else if(window.ActiveXObject) {
  20.                 return new ActiveXObject("Microsoft.XMLHTTP");
  21.                 }
  22.             }
  23.  
  24.             function muestraContenido() {
  25.                 if(peticion_http.readyState === 4) {
  26.                 if(peticion_http.status === 200)
  27.                 {
  28.                     return peticion_http.responseText;
  29.                 }
  30.                     else // Este else no me vale para nada, ya que status se pone a 200 antes que readyState se ponga a 4.
  31.                         alert("Esperando");
  32.             }
  33.             }

Archivo codigo.js
Código Javascript:
Ver original
  1. window.addEventListener('load', iniciar, false);
  2.  
  3.     function iniciar()
  4.     {
  5.         document.getElementById('boton').addEventListener('click', enviar, false);
  6.     }
  7.  
  8.  
  9.     function enviar()
  10.     {
  11.         var cadena = document.getElementById('numero').id + "=" + document.getElementById('numero').value;
  12.         resultado = cargaContenido("adivina.php", 'POST', cadena, muestraContenido);
  13.         document.getElementById('resultado').textContent = resultado;
  14.     }

Archivo adivina.php
Código PHP:
Ver original
  1. <?php
  2.  
  3.     $numero = $_POST['numero'];
  4.  
  5.     if (isset($aleatorio))
  6.     {
  7.         if ($numero === $aleatorio)
  8.         {
  9.             echo "Acertaste";
  10.         }
  11.         else if ($numero > $aleatorio)
  12.         {
  13.             echo "Te has pasado";
  14.         }
  15.         else
  16.             echo "Te quedas corto";
  17.     }
  18.     else
  19.         $aleatorio = rand(1, 20);
  20.  
  21.     //echo $aleatorio;
  22.  
  23. ?>

Imagino que el problema está en el archivo php, que no devuelvo correctamente el valor (aunque pensaba que ajax.responseText recogía el echo) o, si no, en la forma de recoger el valor en ajax, (la llamada a la función CargaContenido no me devuelve nada).

¿Alguien puede orientarme?

Gracias.
  #2 (permalink)  
Antiguo 25/04/2014, 08:01
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: A vueltas con el Ajax

Genera el número aleatorio arriba, de lo contrario if no lo compara. Haz la prueba levantando directamente en el archivo php.
Código PHP:
Ver original
  1. $aleatorio = rand(1, 20);
  2. $numero = 3;//$_POST['numero'];
  3.  
  4. if (isset($aleatorio)) {
  5.   if ($numero === $aleatorio) {
  6.     echo "Acertaste ";
  7.   } else if ($numero > $aleatorio) {
  8.     echo "Te has pasado ";
  9.   } else {
  10.     echo "Te quedas corto ";
  11.   }
  12. }
  #3 (permalink)  
Antiguo 25/04/2014, 08:02
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: A vueltas con el Ajax

Hola:

No sé porqué complicas tanto la legibilidad...

Esto:

var cadena = document.getElementById('numero').id + "=";// + document.getElementById('numero').value;

Se resume con

var cadena = "numero="...

Y en php, cunado averiguas si existe la variable $aleatorio, evidentemente no existe (a no ser que exista más código que estés ocultando), así que simplemente se hace una asignación sin ninguna instrucción "echo"...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #4 (permalink)  
Antiguo 26/04/2014, 02:27
Avatar de replica  
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: A vueltas con el Ajax

Cita:
Iniciado por bathorz Ver Mensaje
Genera el número aleatorio arriba, de lo contrario if no lo compara. Haz la prueba levantando directamente en el archivo php.
Código PHP:
Ver original
  1. $aleatorio = rand(1, 20);
  2. $numero = 3;//$_POST['numero'];
  3.  
  4. if (isset($aleatorio)) {
  5.   if ($numero === $aleatorio) {
  6.     echo "Acertaste ";
  7.   } else if ($numero > $aleatorio) {
  8.     echo "Te has pasado ";
  9.   } else {
  10.     echo "Te quedas corto ";
  11.   }
  12. }
Con esto, lo que parece es que el número aleatorio se genera cada vez que se llama a "Adivina.php", ¿no?

Entonces, ¿si quiero generar un número aleatorio la primera vez que entro, y conservarlo hasta que se adivine, debería de utilizar una cookie, sesión o localStorage?

Tampoco sé por qué comentas $_POST['numero']; Pensaba que esto debería de funcionar así.
  #5 (permalink)  
Antiguo 26/04/2014, 02:42
Avatar de replica  
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: A vueltas con el Ajax

Cita:
Iniciado por caricatos Ver Mensaje
Hola:

No sé porqué complicas tanto la legibilidad...

Esto:

var cadena = document.getElementById('numero').id + "=";// + document.getElementById('numero').value;

Se resume con

var cadena = "numero="...

Y en php, cunado averiguas si existe la variable $aleatorio, evidentemente no existe (a no ser que exista más código que estés ocultando), así que simplemente se hace una asignación sin ninguna instrucción "echo"...

Saludos
Pues porque voy haciendo cambios en el código cuando algo no me funciona, y al parámetro que le estaba pasando a la función necesitaba el nombre que requiere el php para poder trabajar con el array $_POST (para mi caso, faltaba 'numero').

No sé, es un código rápido y tonto, y me vino así a la cabeza, y no le di mayor importancia. Cuando me pongo a repasar y debuggear el código siempre tengo algo que corregir.

Y no, no estoy ocultando ningún código. No se trata de ningún proyecto para una mega corporación. Sólo trato de averiguar cómo trabaja el php cuando se le llama desde ajax. Por lo que parece, no tiene ninguna memoria, y se vuelve a hacer todo desde 0. Posiblemente, al devolver el resultado desde php a ajax, debería de pasar el número aleatorio, para después, al volver a llamar al php, pasárselo otra vez como un parámetro post. Así no es necesario utilizar cookies.

Para devolver el resultado desde php a ajax sólo puedo utilizar echo? ¿No se puede utilizar un return?

¿Y si hago varios echos? ¿Se reciben todos? ¿O sólo el primero o el último?

Pues por eso voy haciendo pruebas.

En cualquier manual de ajax, lo que siempre veo es cómo se crea el objeto HttpRequest, la función open y send, pero no veo lo que puede hacer el php.
  #6 (permalink)  
Antiguo 26/04/2014, 03:41
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: A vueltas con el Ajax

Hola:

Empezaremos por lo que evidentemente no entendiste...

el id de un elemento cuyo id="numero", será "número", evidentemente, así que poner
document.getElementById("numero").id
... es eqwuivalente a poner:
"numero"// evidentemente...

Sobre lo que puedes recoger con ajax es bastante simple, con responseText, obtienes texto plano, y en php puedes generarlo con todas las maneras de enviar datos a la consola en ese lenguaje: echo, print_r, print..., y mediante responseXML, obtienes un documento xml bien formado, que desde php puedes hacerlo con las distintas maneras de escribir datos, más la cabecera xml (header)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 26/04/2014, 09:12
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: A vueltas con el Ajax

Asignar un valor y comentar $_POST['numero'] para una prueba, nada más.
El número aleatorio se generaba cada vez, correcto. Ahora ya no.
Conservar el valor lo he hecho en el php, puedes buscar otro modo.

Esta es una forma entre tantas de hacerlo funcionar. Luego afinas, corriges, cambias a gusto.

Código Javascript:
Ver original
  1. window.onload = function() {
  2.  
  3.         function ajax(url, datos) {
  4.           var oAjax;
  5.           if (window.XMLHttpRequest) {
  6.             oAjax = new XMLHttpRequest();
  7.           } else {
  8.             oAjax = new ActiveXObject("Microsoft.XMLHTTP");
  9.           }
  10.           oAjax.open("POST", url, true);
  11.           oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  12.           oAjax.send(datos);
  13.  
  14.           oAjax.onreadystatechange = function() {
  15.             if (oAjax.readyState === 4 && oAjax.status === 200) {
  16.               rta.innerHTML = oAjax.responseText;
  17.             }
  18.           };
  19.         }
  20.  
  21.         var rta = document.getElementById("rta");
  22.         var boton = document.getElementById('boton');
  23.  
  24.         boton.addEventListener('click', function(e) {
  25.           var cadena = 'numero=' + document.getElementById('numero').value;
  26.           ajax('adivina.php', cadena);
  27.         });
  28.  
  29.       };
Código HTML:
Ver original
  1. Adivina entre 1 y 10
  2.     <input type="number" name="numero" id="numero" />
  3.     <button id="boton">boton</button>
  4.     <div id="rta">Rta.</div>

adivina.php
Código PHP:
Ver original
  1. if (!$numero) {
  2.   $numero = $_POST['numero'];
  3.   $aleatorio = rand(1, 10);
  4. }
  5.  
  6. $html = $numero;
  7. switch (true) {
  8.   case ($numero == ''):
  9.     echo " Falta número ";
  10.     exit;
  11.   case ($numero == $aleatorio):
  12.     $html .= " Acertaste ";
  13.     break;
  14.   case ($numero > $aleatorio):
  15.     $html .= " Te has pasado ";
  16.     break;
  17.   default:
  18.     $html .= " Te quedas corto ";
  19.     break;
  20. }
  21. $html .= $aleatorio;
  22. echo $html;
  #8 (permalink)  
Antiguo 27/04/2014, 07:39
Avatar de replica  
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: A vueltas con el Ajax

Cita:
Iniciado por caricatos Ver Mensaje
Hola:

Empezaremos por lo que evidentemente no entendiste...

el id de un elemento cuyo id="numero", será "número", evidentemente, así que poner
document.getElementById("numero").id
... es eqwuivalente a poner:
"numero"// evidentemente...
No soy tonto ni soy novato, tengo muchísima experiencia programando en otros entornos, y sé perfectamente lo que dijiste, así que esos términos, por favor, no te los admito. Guárdatelos, como moderador, para los "moscones" que sólo hacen que copiar y pegar código ajeno, porque no es mi caso.

Estoy muy acostumbrado a hacer eso, porque hago otras construcciones donde la id de la etiqueta html viene con una variable (porque hago más de un campo, simplemente), así que es una construcción totalmente lógica.

Cita:
Iniciado por caricatos Ver Mensaje
Sobre lo que puedes recoger con ajax es bastante simple, con responseText, obtienes texto plano, y en php puedes generarlo con todas las maneras de enviar datos a la consola en ese lenguaje: echo, print_r, print..., y mediante responseXML, obtienes un documento xml bien formado, que desde php puedes hacerlo con las distintas maneras de escribir datos, más la cabecera xml (header)

Saludos
Esto sí que te lo agradezco muchísimo. Pero sigo sospechando que cuando acaba la ejecución de php se pierden todos los datos almacenados en las variables, y no sé cuál es la forma correcta de trabajar con ello, cuando no quiero que se pierdan.

Voy a probar a devolver esos datos por ajax, que ahí se deberían de mantener siempre en memoria, ya que la ejecución de javascript no debería de perderse hasta que se cierra la pestaña del navegador.
  #9 (permalink)  
Antiguo 27/04/2014, 10:05
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: A vueltas con el Ajax

Hola:

Cita:
Iniciado por replica Ver Mensaje
... y sé perfectamente lo que dijiste, así que esos términos, por favor, no te los admito. Guárdatelos, como moderador, para los "moscones" que sólo hacen que copiar y pegar código ajeno, porque no es mi caso.

...
No entiendo lo que quieres decir, cuando yo simplemente hice un copy and paste...

Tampoco comprendo que comentes mi status de moderador, cuando mi respuesta ha sido como usuario llano... no te confundas...

Sobre la respuesta php, podemos mover el tema a ese foro, pero al respecto, php no guarda variables a no ser que lo programes por ejemplo con variables de sesión, y solo va a procesar lo que le pidas...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #10 (permalink)  
Antiguo 27/04/2014, 12:30
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: A vueltas con el Ajax

Tienes que tener muy claro una cosa: La diferencia que hay entre un lenguaje de servidor (PHP) y un lenguage del cliente (javascript).

El lenguaje del servidor se encarga de ejecutar una tarea en el servidor, lo que le permite por ejemplo usar un abse de datos para manejar información persistente. Para los principiantes, se podría decir que el lenguaje de servidor se encarga de generar el HTML con el contenido que se le enviará al navegador del cliente.

Por otro lado está javascript, que es un lenguaje de programación esitlo script. ¿Qué significa ésto? Que es un lenguaje interpretado: Es un código en texto plano que se ejecuta en tiempo real, conforme lo va "leyendo" el navegador. Y ésa es la clave: El navegador lo ejecuta, así que javascript no tiene NADA QUE VER con el lenguaje de servidor, php en este caso, que estes utilizando. Repito. NO HAY RELACIÓN NINGUNA ENTRE JAVASCRPT y PHP.

PHP puede devolver páginas con HTML y javascript dentro, pero a PHP le da igual, par él, sólo es texto plano.

Javascript es un lenguaje del lado del cliente pensado para hacer páginas dinámicas: Un código que se ejecuta en el navegador y que puede acceder a todos los elementos HTML de la página, y eventos dispares como los del teclado, ratón, load de imágenes, etc, con el objetivo de ejecutar alguna acción interesante. Aunque ahora CSS le está quitando mucho trabajo, antes javascript se usaba para hacer menus desplegables, rollover de imágenes cuando pones el ratón encima, validaciones sencillas de formularios antes de enviarlos, etc.


Y ¿Qué es AJAX? Ajax no es más que la forma de realizar una llamada HTTP asíncrona al servidor, sin necesidad de recargar la página completamente, mediante instrucciones javascript ¿Qué quiere decir eso? Que no necesitas refrescar la página (con todas las ventajas que ello implica). Por ejemplo, estás viendo un video en youtube, y quieres darle a "me gusta". Antes tenías que recargar la página completamente tras enviar el formulario al servidor de youtube, con lo que si estabas viendo el video, te lo cortaba y tenías que empezar de nuevo cuando el navegador cargue de nuevo la página.

Con ajax y javasxcript ya no. Tu estás viendo el video, aprietas "me gusta", y javascript lanzará una llamada http al servidor enviando los datos necesarios para que youtube sepa a qué video meterle un voto positivo. El cliente ni se entera, seguirá viendo tranquilamente el video porque la llamada AJAX se hace en segundo plano, sin molestar. Cuando ésta responda, javascript puede leer lo que el servidor ha respondido, y actuar en consecuencia.

Su casos de uso son miles, el límite es tu imaginación. O la imaginación del tipo que escribió el libro que estás leyendo para aprender. Interesa que leas también sobre JSON, ya que ajax y json son muy amigos. Y JSON no es más que un formato de cadenas strings que sirve para representar casi caulqueir objeto "javascript" como si fuera una cadena. Si vienes de java, JSON sirve para "serializar" objetos. PHP tiene json_decode y json_encode que serializan objetos y arrays PHP en forma de cadenas json, y javascript tiene dos funciones JSON.stringify y JSON.parse para hacer lo mismo respectivamente.

Y ahora centrándonos en tu juego: El número aleatorio una de dos: O lo metes en sessión, en la misma página donde muestras el formulario que usas para jugar, o la metes en un campo HIDDEN del formulario, por ejemplo "solucion", asi que la página llamada por ajax comprobará si el campo "numero" es igual al campo "solucion", ambos le llegan por POST. Ésto hace que el el valor de la solucion pueda ser "vista" por el jugador que sepa usar una consola de desarrollador, pero como dices, sólo es para practicar .
  #11 (permalink)  
Antiguo 27/04/2014, 23:41
Avatar de replica  
Fecha de Ingreso: noviembre-2004
Mensajes: 68
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: A vueltas con el Ajax

Gracias, marlanga.

Tenía muy claro lo de lenguaje de cliente y de servidor, no era ese el problema que tenía.
Y también sabía de las facilidades que daba ajax para evitar cargar las páginas.

Te tomo el dato sobre Json, que sobre esto nunca me había informado, y supongo que ahora me será necesario.

Sobre el juego, sí, había pensado en poner un input oculto y meter la información que devuelve el php.

Muchas gracias!

Etiquetas: ajax, html, php
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 12:58.