Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiorna div, ma solo se sono presenti nuovi contenuti dal file php

Ho affrontato un problema simile non molto tempo fa, presumo che tu stia usando mysql o qualcosa del genere per i tuoi commenti lato server di archiviazione?

Ho risolto il mio problema aggiungendo prima la colonna intera timestamp alla mia tabella mysql, quindi quando ho aggiunto una nuova riga, avrei semplicemente usato time() per salvare l'ora corrente.

esempio di inserimento riga mysql:

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

il secondo passo sarebbe json_encode i dati che invii dal lato server:

$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

Quindi, ora invece del puro html, il tuo script lato server restituisce qualcosa del genere:

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

Puoi prendere i dati in javascript abbastanza semplicemente:

<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>

che praticamente si occupa della comunicazione tra server e client, ora basta interrogare il tuo database in questo modo:

$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;';

I timestamp vengono passati avanti e indietro, il client invia sempre il timestamp restituito dal server nella query precedente.

Il tuo server invia solo i commenti che sono stati inviati dall'ultima volta che hai controllato e puoi anteporli alla fine dell'html come ho fatto io. (attenzione:non ho aggiunto alcun tipo di controllo della sanità mentale, i tuoi commenti potrebbero diventare estremamente lunghi)

Dato che esegui il polling di nuovi dati ogni 10 secondi, potresti prendere in considerazione l'invio di dati puri attraverso la chiamata ajax per risparmiare una notevole larghezza di banda (stringa json con solo timestamp, è solo di circa 20 byte).

Puoi quindi utilizzare javascript per generare l'html, ha anche il vantaggio di scaricare molto lavoro dal tuo server al client :). Avrai anche un controllo molto più preciso su quanti commenti desideri visualizzare contemporaneamente.

Ho fatto alcune ipotesi abbastanza grandi, dovrai modificare il codice in base alle tue esigenze. Se usi il mio codice e la tua casa del gatto|computer|esplode, puoi conservare tutti i pezzi :)