2012-08-09 2 views
0

데이터베이스에 새 항목이있을 때 해당 항목을 다시로드하지 않고 라이브 웹 사이트에 표시하려고합니다. 가장 좋은 방법은 무엇입니까?데이터베이스에 새 항목이있을 때 새 항목을 표시하는 가장 좋은 방법

+0

사용 아약스 요청을 마지막으로 사이트 날짜 또는 ID에 표시하여 최신 항목을 선택합니다 ... –

+0

글쎄, "다시로드하지 않고"기본적으로 "AJAX"- XHR (끌어 오기), iframe (끌어 오기), XHR/혜성 (밀어 넣기), 또는 심지어 플래시/SL 등의 형태로 제공됩니다. 정말로 너무 애매하고 충분히 세련되지 않았습니다. –

답변

0

아약스와

check(); 

function check() { 

    // ajax 

    setTimeout(check, 5000); // check every 5 seconds 
} 
1

가장 좋은 방법은 (웹 서버를 폴링하도록 AJAX를 사용) 롱 폴링을 사용하는 것입니다 시간 제한이있는 재귀 함수.

var timestamp = null; 

function waitForMsg() { 
    $.ajax({ 
     type: "POST", 
     url: "/path/to/php-script.php", 
     data: { timestamp: timestamp }, 
     async: true, 
     cache: false, 
     success: function(data) { 
      var json = eval('(' + data + ')'); 

      if(json['msg'] !== '') { 
       $('#example-element').append(json['msg'] + '<br />'); 
      } 

      timestamp = json['timestamp']; 
      setTimeout(waitForMsg, 1000); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      $('#error').html('Error: ' + textStatus + ' (' + errorThrown + ')'); 
      setTimeout(waitForMsg, 15000); 
     } 
    }); 
} 

$(document).ready(function() { 
    waitForMsg(); 
}); 

를 그리고 PHP 같은 것을 볼 수 있습니다 :이 방법은 jQuery를 통해 롱 폴링 (혜성)를 사용

$filename = 'text_file.txt'; // Replace this with a "$query" if using a db 
$lastmod = isset($_POST['timestamp']) ? $_POST['timestamp'] : 0; 
$currmod = filemtime($filename); 

while($currmod <= $lastmod) { 
    usleep(10000); 
    clearstatcache(); 
    $currmod = filemtime($filename); 
} 

$response = array(); 
$response['msg'] = file_get_contents($filename); // Or run your db query here 
$response['timestamp'] = $currmod; 

echo json_encode($response); 
+0

'setTimeout' /'setInterval'에 문자열을 전달하지 마십시오. 필요가 없습니다. 'setTimeout (waitForMsg, 15000);'이 여기에서 작동합니다 (전역 범위에서의 충돌을 피하거나 "전역 범위"에서 waitForMsg를 가지지 않습니다). –

+0

@pst 제안을 테스트했지만 여전히 작동합니다. 고침, 고마워. –

관련 문제