Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problemas mostrar resultados con AJAX Long Polling

Estas en el tema de Problemas mostrar resultados con AJAX Long Polling en el foro de Javascript en Foros del Web. Hola que tal. Hago este tema por que estoy practicando algo de AJAX Long Polling, estoy utilizando un script que saqué del tema creado por ...
  #1 (permalink)  
Antiguo 03/09/2013, 17:03
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 8 años, 8 meses
Puntos: 0
Problemas mostrar resultados con AJAX Long Polling

Hola que tal. Hago este tema por que estoy practicando algo de AJAX Long Polling, estoy utilizando un script que saqué del tema creado por Patkoala (http://www.forosdelweb.com/f13/aporte-chat-basico-con-ajax-long-polling-958530/ )

Lo que estoy intentando implementar es un chat pero en lugar de utilizarlo con un documento .txt hacerlo con base de datos MySQL. El problema que estoy teniendo es que no se MUESTRAN los datos. Se insertan correctamente en la tabla pero luego no los puedo mostrar, aca les dejo los archivos:

muestra.php : El archivo que teóricamente debería mostrar lo que se extrajo de la base de datos.


Código PHP:

<?php 
$link
=mysql_connect("localhost""root""");
mysql_select_db("prueba",$link) OR DIE ("Error: No es posible establecer la conexión");

set_time_limit(0); 
//$fpa = fopen("content.txt","r"); 
//$fpa = fgets($fpa); 
$sql "SELECT * FROM chat";
$ejecutar mysql_query($sql$link);
while (
$row mysql_fetch_row($ejecutar)){
        
$id$row[3];
    }
while(
1){
    
//$fp = fopen("content.txt","r"); 
    //$fp = fgets($fp);
    
$sql1 "SELECT * FROM chat";
    
$ejecutar1 mysql_query($sql1$link); 
    while (
$row1mysql_fetch_row($ejecutar1)){
        if (
$row1[3] > $id){
            echo 
"<strong>$row1[0]</strong> dijo: $row1[1]"
            
            break; 
        }
    
    }    
    
sleep(1);


?>
introducir.php : Este archivo introduce los datos en la tabla MySQL (Funciona correctamente hasta donde pude probar)

Código PHP:

<?php 
$link
=mysql_connect("localhost""root""");
mysql_select_db("prueba",$link) OR DIE ("Error: No es posible establecer la conexión");
//$fp = fopen("content.txt","w"); 
$valor $_POST['value']; 
$nombre ucfirst($_POST['nom']);
$insert "INSERT INTO chat (nombre, mensaje, time, id) VALUES ('$nombre', '$valor', '' , '') ";
mysql_query($insert$link);
//$valor = "<b>".$nombre."</b> : ".$valor; 
//fwrite($fp,$valor); 

?>

Y por último

index.php : Archivo que contiene el script de ajax donde deberían mostrarse los mensajes enviados por los usuarios y el textarea para enviar nuevos mensajes

Código PHP:

<?php 
$link
=mysql_connect("localhost""root""");
mysql_select_db("prueba",$link) OR DIE ("Error: No es posible establecer la conexión");
?>
<html>
<head>
    <script type="text/javascript">
        nombre = prompt("Introduce tu nombre");
        function xhr(){
            if(window.XMLHttpRequest){
                return new XMLHttpRequest();
            } else if(window.ActiveXObject){
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
        function mostrar(){
            var peticion = xhr();
            peticion.onreadystatechange = function () {
                if(peticion.readyState == 4){ 
                    var detalles = document.getElementById("cont");
                    /* objDatos = eval("(" + cadCodificadaJSON + ")"); */
                    detalles.innerHTML= peticion.responseText;
                    setTimeout("mostrar()",1000);
                }
            }
            peticion.open("POST","index.php",true);
            peticion.send(null);
        }
        function crearquery(){
            var texto = document.getElementsByTagName('textarea')[0].value;
            var salida = "value=" + encodeURIComponent(texto) + "&nom=" + encodeURIComponent(nombre);
            return salida;
        }
        function cambia(){
            var peticion = xhr();
            peticion.open("POST","introducir.php",true);
            peticion.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            var query = crearquery();
            peticion.send(query);
            document.getElementsByTagName('textarea')[0].value = '';
        }
        window.onload = mostrar;
    </script>
</head>
<body>
    <textarea></textarea><br>
         <button onclick="cambia();">Enviar</button>
    <div id="cont"></div>
</body>
</html>

Bueno espero que hayan entendido el problema y puedan ayudarme.

Muchas gracias de antemano y saludos para todos.
  #2 (permalink)  
Antiguo 04/09/2013, 09:50
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 13 años, 4 meses
Puntos: 1532
Respuesta: Problemas mostrar resultados con AJAX Long Polling

si mal no recuerdo en ese código se borraba periódicamente el archivo, si no, la data del chat crecería tanto que seria inviable el chat.

lo que tienes que hacer es pasar, por cada petición el "pivote" o posición del último ID devuelto por PHP, para que puedas filtrar el select (where id > pivote), de ésa forma y hasta que NO existan nuevos registros, no devolverías nada, sino que quedarías en un while hasta que mysql te devuelva algo y envías la data.

seria la forma de garantizar un autentico long polling, de lo contrario, y como lo tienes que extraes TODOS los datos de la tabla, está funcionando como un polling tradicional, y queda demás decirte que sería un caos total, saludos
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 04/09/2013, 13:42
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problemas mostrar resultados con AJAX Long Polling

Ahhh claro, recién estuve probando pero no se me ocurre forma alguna de pasarle al muestra.php el último id. Como puedo hacer? tenés alguna idea?


Muchisimas gracias por la ayuda.

Saludos
  #4 (permalink)  
Antiguo 04/09/2013, 13:56
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 13 años, 4 meses
Puntos: 1532
Respuesta: Problemas mostrar resultados con AJAX Long Polling

Ahora que lo veo, en el AJAX te falta evaluar el XHR.status == 200 junto con el XHR.readyState == 4, es fundamental para que funcione.

con respecto al ultimo ID, se lo pasas como parámetro POST o GET
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 04/09/2013, 14:23
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problemas mostrar resultados con AJAX Long Polling

Claro, mira estuve modificando un poco los archivos, el problema ahora es que no me deja PARSEAR, lo recibo como JSON pero no puedo parsearlo desde el AJAX:


Código HTML:
function mostrar(){
			var peticion = xhr();
			peticion.onreadystatechange = function () {
				if(peticion.readyState == 4 && peticion.status == 200){ 
					var datos = JSON.parse(peticion.responseText);
					alert(datos.nombre);
					detalles.innerHTML = datos.nombre;				
					setTimeout("mostrar()",1000);
				}
			}
			peticion.open("POST","index.php",true);
			peticion.send(null);
		}


Y en el archivo muestra.php tengo lo siguiente:


Código PHP:

header
("Content-type: application/json");
$link=mysql_connect("localhost""root""");
mysql_select_db("prueba",$link) OR DIE ("Error: No es posible establecer la conexión");

set_time_limit(0); 

$last_id2;
$datos false;

$sql "SELECT * FROM chat WHERE id > " $last_id;

while (
$datos == false) {

    
$buffer mysql_query($sql$link);

    
$datos mysql_fetch_assoc($buffer);

    if (
$datos) {
        
$datos json_encode($datos);
        echo 
$datos;
        break;
    }

    
sleep(1);


Y me sigue sin funcionar, lo que me muestra en el index es:

{"nombre":"Asew","mensaje":"asd","time":"","id":"3 "}


Osea calculo que está bien eso, pero no puedo parsearlo para que lo muestre en formato texto para utilizarlo con JS y darle "estilo" por asi decirlo.


Disculpa mi ignorancia, es que recién estoy metiéndome en ésto de ajax y no hay mucha información en español, me leí todo Google y nada. Mil gracias nuevamente.
  #6 (permalink)  
Antiguo 05/09/2013, 08:01
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 13 años, 4 meses
Puntos: 1532
Respuesta: Problemas mostrar resultados con AJAX Long Polling

puede deberse a que a la salida del script se vuelcan caracteres de más:

1 - verifica que la codificación del archivo sea UTF8 sin BOM

2 - elimina los espacios en blanco antes del <?php

3 - no es necesario que uses ?>

4 - lo ideal es que uses die($datos); así terminas el proceso y devuelves la data a la salida
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #7 (permalink)  
Antiguo 05/09/2013, 10:10
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problemas mostrar resultados con AJAX Long Polling

Lo pude solucionar, recolecté el último ID haciendo una consulta en la base de datos arriba de todo en el index, depués se lo pase al ajax y se lo asigne a la variable "last_id" que fue enviada por post en la consulta, ahora el problema que me surgió es que cuando se ingresa un nuevo mensaje, éste mismo reemplaza al anterior, osea no se muestra el hilo de la conversacion, intente metiendo todos los mensajes que se iban ingresando en un array pero no dio resultado, igualmente ya está. Mil gracias y un saludo !

Etiquetas: ajax, inconveniente
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 22:11.