sql >> Databáze >  >> RDS >> Mysql

Obnovit div, ale pouze pokud je nový obsah ze souboru php

Před nedávnem jsem čelil podobnému problému, předpokládám, že používáte mysql nebo něco pro ukládání komentářů na serveru?

Vyřešil jsem svůj problém tak, že jsem do své tabulky mysql nejprve přidal celočíselný sloupec časového razítka, pak když jsem přidal nový řádek, jednoduše bych použil time() pro uložení aktuálního času.

příklad vložení řádku mysql:

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

druhým krokem by bylo json_encode dat, která odesíláte ze serveru:

$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

Takže nyní místo čistého html vrací váš skript na serveru něco takového:

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

Data můžete získat v javascriptu jednoduše:

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

který se do značné míry stará o komunikaci mezi serverem a klientem, nyní stačí zadat dotaz na databázi takto:

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

Časová razítka se předávají tam a zpět, klient vždy posílá časové razítko vrácené serverem v předchozím dotazu.

Váš server posílá pouze komentáře, které byly odeslány od poslední kontroly, a můžete je přidat na konec html, jako jsem to udělal já. (varování:nepřidal jsem k tomu žádnou kontrolu zdravého rozumu, vaše komentáře mohou být extrémně dlouhé)

Protože každých 10 sekund dotazujete na nová data, možná budete chtít zvážit odeslání čistých dat přes volání ajax, abyste ušetřili podstatnou část šířky pásma (řetězec json s pouze časovým razítkem má pouze asi 20 bajtů).

Ke generování html pak můžete použít javascript, má to také výhodu, že přenese spoustu práce z vašeho serveru na klienta :). Získáte také mnohem jemnější kontrolu nad tím, kolik komentářů chcete zobrazit najednou.

Udělal jsem několik poměrně velkých předpokladů, budete muset upravit kód tak, aby vyhovoval vašim potřebám. Pokud použijete můj kód a váš kočičí|počítač|náhodou exploduje, budete si moci nechat všechny části :)



  1. Jak používat aws athena pomocí nodejs?

  2. Nejprve vytvořit uložené procedury pomocí Entity Framework Code?

  3. 2 způsoby, jak vložit nový řádek do řetězce v SQLite

  4. vyhodnotit výraz v MySQL