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

Opdater div, men kun hvis der er nyt indhold fra php-filen

Jeg har stået over for lignende problem for ikke så længe siden, jeg går ud fra, at du bruger mysql eller noget til din kommentarlagring på serversiden?

Jeg løste mit problem ved først at tilføje tidsstempel heltalskolonnen til min mysql-tabel, så når jeg tilføjede en ny række, ville jeg bare bruge time() for at gemme den aktuelle tid.

mysql række indsæt eksempel:

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

trin to ville være at json_encode de data, du sender fra serverside:

$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

Så nu i stedet for ren html, returnerer dit serverside-script noget som dette:

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

Du kan få fat i dataene i javascript ganske enkelt:

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

der stort set tager sig af kommunikationen mellem server og klient, nu forespørger du bare din database noget som dette:

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

Tidsstemplerne sendes frem og tilbage, klienten sender altid tidsstemplet returneret af serveren i tidligere forespørgsel.

Din server sender kun kommentarer, der er indsendt siden du tjekkede sidste gang, og du kan lægge dem foran i slutningen af ​​html'en, som jeg gjorde. (advarsel:jeg har ikke tilføjet nogen form for fornuftskontrol til det, dine kommentarer kan blive ekstremt lange)

Da du spørger efter nye data hvert 10. sekund, vil du måske overveje at sende rene data på tværs af ajax-opkaldet for at spare betydelige stykker båndbredde (json-strengen med kun tidsstempel er kun omkring 20 bytes).

Du kan derefter bruge javascript til at generere html'en, det har også den fordel, at det aflaster meget af arbejdet fra din server til klienten :). Du vil også få meget bedre kontrol over, hvor mange kommentarer du vil vise på én gang.

Jeg har lavet nogle ret store antagelser, du bliver nødt til at ændre koden, så den passer til dine behov. Hvis du bruger min kode, og dit kat|computer|hus tilfældigvis eksploderer, får du beholde alle brikkerne :)



  1. kan ikke slippe en fremmednøgle i mySQL

  2. php:Gem billede i Mysql blob, godt eller dårligt?

  3. Hvordan opretter man trætabel uden cyklisk relation?

  4. Forældretræ i mysql-tabel (while-loop)