sql >> Base de Datos >  >> RDS >> Mysql

Actualizar div, pero solo si hay contenido nuevo del archivo php

Me enfrenté a un problema similar no hace mucho tiempo, ¿supongo que está usando mysql o algo así para el servidor de almacenamiento de comentarios?

Resolví mi problema agregando primero la columna de enteros de marca de tiempo a mi tabla mysql, luego, cuando agregué una nueva fila, simplemente usé time() para guardar la hora actual.

ejemplo de inserción de fila mysql:

$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";

el segundo paso sería json_encode los datos que envía desde el servidor:

$output = array();

if ($html && $html !== '') {   // do we have any script output ?
  $output['payload'] = $html;  // your current script output would go in this variable
}
$output['time'] = time();      // so we know when did we last check for payload update

$json = json_encode($output, ((int)JSON_NUMERIC_CHECK)); // jsonify the array
echo $json;                    // send it to the client

Entonces, ahora en lugar de html puro, su secuencia de comandos del servidor devuelve algo como esto:

{
  "payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
  "time":1354167493
}

Puede obtener los datos en javascript simplemente:

<script type="text/javascript"> // <![CDATA[

var lastcheck;
var content_main = $('#content_main');

pollTimer = setInterval(function() {
  updateJson();
}, 10000);

function updateJson() {
  var request = '/feed_main.php?timestamp='+ (lastcheck ? lastcheck : 0);

  $.ajax({
    url: request,
    dataType: 'json',
    async: false,
    cache: false,
    success: function(result) {
      if (result.payload) {        // new data
        lastcheck = result.time;   // update stored timestamp
        content_main.html(result.payload + content_main.html()); // update html element
      } else {                     // no new data, update only timestamp
        lastcheck = result.time;
      }
    }
  });
}

// ]]> </script>

que prácticamente se encarga de la comunicación entre el servidor y el cliente, ahora solo consulta tu base de datos de esta manera:

$timestamp = 0;
$where = '';

if (isset($_GET['timestamp'])) {
  $timestamp = your_arg_sanitizer($_GET['timestamp']);
}

if ($timestamp) {
  $where = ' WHERE timestamp >= '.$timestamp;
}

$query = 'SELECT * FROM comments'. $where .' ORDER BY timestamp DESC;';

Las marcas de tiempo se pasan de un lado a otro, el cliente siempre envía la marca de tiempo devuelta por el servidor en la consulta anterior.

Su servidor solo envía comentarios que se enviaron desde la última vez que verificó, y puede anteponerlos al final del html como lo hice yo. (Advertencia:no he agregado ningún tipo de control de cordura a eso, sus comentarios podrían ser extremadamente largos)

Dado que sondea datos nuevos cada 10 segundos, es posible que desee considerar enviar datos puros a través de la llamada ajax para ahorrar un ancho de banda sustancial (cadena json con solo marca de tiempo, solo tiene alrededor de 20 bytes).

Luego puede usar javascript para generar el html, también tiene la ventaja de descargar gran parte del trabajo de su servidor al cliente :). También obtendrá un control mucho más preciso sobre cuántos comentarios desea mostrar a la vez.

He hecho algunas suposiciones bastante grandes, tendrá que modificar el código para adaptarlo a sus necesidades. Si usas mi código y la casa de tu gato|computadora|explota, te quedas con todas las piezas :)