Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm mới div, nhưng chỉ khi có nội dung mới từ tệp php

Tôi đã gặp vấn đề tương tự cách đây không lâu, tôi cho rằng bạn đang sử dụng mysql hoặc thứ gì đó cho máy chủ lưu trữ nhận xét của bạn?

Tôi đã giải quyết vấn đề của mình bằng cách thêm cột số nguyên dấu thời gian vào bảng mysql của mình, sau đó khi tôi thêm một hàng mới, tôi chỉ cần sử dụng time() để tiết kiệm thời gian hiện tại.

Ví dụ chèn hàng mysql:

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

bước hai sẽ là json_encode dữ liệu bạn gửi từ bên máy chủ:

$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

Vì vậy, bây giờ thay vì html thuần túy, tập lệnh phía máy chủ của bạn trả về một cái gì đó như sau:

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

Bạn có thể lấy dữ liệu trong javascript đủ đơn giản:

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

điều đó quan tâm khá nhiều đến giao tiếp giữa máy chủ và máy khách, bây giờ bạn chỉ cần truy vấn cơ sở dữ liệu của mình như sau:

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

Các dấu thời gian được chuyển qua lại, máy khách luôn gửi dấu thời gian do máy chủ trả về trong truy vấn trước đó.

Máy chủ của bạn chỉ gửi các nhận xét đã được gửi kể từ khi bạn kiểm tra lần trước và bạn có thể thêm chúng vào cuối html như tôi đã làm. (cảnh báo:tôi chưa thêm bất kỳ loại kiểm soát tỉnh táo nào vào đó, nhận xét của bạn có thể rất dài)

Vì bạn thăm dò dữ liệu mới cứ sau 10 giây, bạn có thể muốn xem xét việc gửi dữ liệu thuần túy qua lệnh gọi ajax để tiết kiệm băng thông chunk đáng kể (chuỗi json chỉ có dấu thời gian trong đó, chỉ khoảng 20 byte).

Sau đó, bạn có thể sử dụng javascript để tạo html, nó cũng có lợi thế là giảm tải rất nhiều công việc từ máy chủ của bạn đến máy khách :). Bạn cũng sẽ có được quyền kiểm soát tốt hơn đối với số lượng nhận xét bạn muốn hiển thị cùng một lúc.

Tôi đã đưa ra một số giả định khá lớn, bạn sẽ phải sửa đổi mã cho phù hợp với nhu cầu của mình. Nếu bạn sử dụng mã của tôi và con mèo | máy tính | ngôi nhà của bạn xảy ra vụ nổ, bạn sẽ phải giữ lại tất cả các mảnh :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn Rails 3 với điều kiện có số lượng liên kết

  2. Tại sao không kết nối trực tiếp android với cơ sở dữ liệu?

  3. Sử dụng lại Truy vấn con từ Biểu thức Chọn trong Mệnh đề WHERE

  4. Dừng truy vấn MySQL sau hàng đầu tiên

  5. nhập dữ liệu mysql vào kubernetes pod