Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atualize div, mas somente se houver novo conteúdo do arquivo php


Eu enfrentei um problema semelhante não muito tempo atrás, suponho que você esteja usando mysql ou algo assim para o seu servidor de armazenamento de comentários?

Eu resolvi meu problema adicionando primeiro a coluna inteira timestamp à minha tabela mysql, então quando eu adicionasse uma nova linha, eu simplesmente usaria time() para salvar a hora atual.

Exemplo de inserção de linha mysql:
$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";

o passo dois seria json_encode os dados que você está enviando do lado do 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

Então, agora, em vez de html puro, seu script do lado do servidor retorna algo assim:
{
  "payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
  "time":1354167493
}

Você pode pegar os dados em javascript simplesmente o suficiente:
<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 praticamente cuida da comunicação entre servidor e cliente, agora basta consultar seu banco de dados algo assim:
$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;';

Os timestamps são passados ​​para frente e para trás, cliente sempre enviando o timestamp retornado pelo servidor na consulta anterior.

Seu servidor envia apenas comentários que foram enviados desde a última vez, e você pode preenchê-los no final do html como eu fiz. (aviso:eu não adicionei nenhum tipo de controle de sanidade a isso, seus comentários podem ficar extremamente longos)

Como você pesquisa novos dados a cada 10 segundos, convém considerar o envio de dados puros pela chamada ajax para economizar largura de banda substancial (string json com apenas timestamp, tem apenas cerca de 20 bytes).

Você pode então usar javascript para gerar o html, ele também tem a vantagem de descarregar muito trabalho do seu servidor para o cliente :). Você também terá um controle muito mais preciso sobre quantos comentários deseja exibir de uma só vez.

Eu fiz algumas suposições bastante grandes, você terá que modificar o código para atender às suas necessidades. Se você usar meu código, e seu gato|computador|casa explodir, você fica com todas as peças :)