sql >> Database >  >> RDS >> Mysql

Ververs div, maar alleen als er nieuwe inhoud is van het php-bestand

Ik heb niet zo lang geleden een soortgelijk probleem gehad, ik neem aan dat je mysql of iets dergelijks gebruikt voor de opslag van je opmerkingen aan de serverzijde?

Ik loste mijn probleem op door eerst de tijdstempel integer-kolom toe te voegen aan mijn mysql-tabel, en toen ik een nieuwe rij toevoegde, zou ik gewoon time() gebruiken om de huidige tijd op te slaan.

mysql rij invoegen voorbeeld:

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

stap twee zou zijn om de gegevens die u vanaf de server verzendt te json_encoderen:

$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

Dus in plaats van pure html, retourneert je serverside-script nu zoiets als dit:

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

U kunt de gegevens eenvoudig in javascript pakken:

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

dat zorgt voor de communicatie tussen server en client, nu vraag je je database ongeveer als volgt op:

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

De tijdstempels worden heen en weer doorgegeven, waarbij de client altijd de tijdstempel verzendt die door de server is geretourneerd in de vorige zoekopdracht.

Je server stuurt alleen opmerkingen die zijn ingediend sinds je de laatste keer hebt gecontroleerd, en je kunt ze toevoegen aan het einde van de html zoals ik deed. (waarschuwing:ik heb daar geen enkele vorm van sanity-controle aan toegevoegd, je opmerkingen kunnen extreem lang worden)

Aangezien u elke 10 seconden naar nieuwe gegevens peilt, kunt u overwegen pure gegevens via de ajax-oproep te verzenden om aanzienlijke bandbreedte te besparen (json-tekenreeks met alleen een tijdstempel erin, is slechts ongeveer 20 bytes).

U kunt dan javascript gebruiken om de html te genereren, het heeft ook het voordeel dat veel van het werk van uw server naar de client wordt verplaatst :). Je krijgt ook veel meer controle over hoeveel reacties je tegelijk wilt weergeven.

Ik heb een aantal vrij grote veronderstellingen gemaakt, je zult de code moeten aanpassen aan je behoeften. Als je mijn code gebruikt en je kat|computer|huis ontploft, mag je alle stukjes houden :)



  1. Rails .where() query werkt niet

  2. Voeg meerdere .sql-tabeldumpbestanden samen tot één bestand

  3. Hoe maak je een globaal configuratiebestand aan?

  4. MYSQL Hoe trim te gebruiken in selectiequery