2012-11-30 1 views
7

Google 검색 및 검색 주간 후. data.text라는 플랫 텍스트 파일 대신 데이터베이스 테이블에서 긴 폴링에 대한 단일 자습서를 찾는 일도 어렵습니다. 현재, 나는 data.text에 수동으로 아무것도 쓰지 않고 바로 브라우저에 나타납니다.데이터베이스 데이터로 긴 폴링?

이것은 질문입니다. 데이터베이스를 사용한 Long 폴링? StackOverflow에서도 제대로 응답하지 않습니다. (내가 여기지만 헛된 많이 발견했다.).이 예는 여기에 있습니다 filemtime alternative for MySQL

나는 그것이 데이터베이스에서 데이터를 가져 오는을 위해 수 있도록하기 위해 getdata.php을 수정하는 방법

? 여기 예를 나열하고

id  fro to mesg  time status last_modified 

다음과 같이

$sql=mysqli_query($database,"SELECT * FROM messages where time>=$curr_date ORDER by  time DESC"); 
    while($row=mysqli_fetch_array($sql)){ 
    $messages=$row['messages']; 
    $id=$row['id']; 
    echo $messages; 
    } 

메시지 테이블입니다. 이 예제에서는 세 개의 파일이 사용되고 있습니다.

  1. index.html을
  2. getdat.php
  3. data.text

(MySQL의) 데이터베이스에서 데이터를 얻을 수있는 네 번째 파일을 할 필요가 있는가? 그렇지 않다면 데이터베이스의 동적 데이터를 사용하기 위해 getdata.php 또는 data.text에서 어떤 유형의 변경이 필요합니까?

은 여기 내 자바 스크립트

<script type="text/javascript" charset="utf-8"> 

     var timestamp = null; 

     function waitformsg() { 
      $.ajax({ 
       type:"Post", 
       url:"getdata.php?timestamp="+timestamp, 
       async:true, 
       cache:false, 
       success:function(data) { 
        var json = eval('(' + data + ')'); 
        if(json['msg'] != "") { 
         $("#messages").append(json['msg']); 

        } 
        timestamp = json["timestamp"]; 

        setTimeout("waitformsg()", 1000); 
       }, 
       error:function(XMLhttprequest, textstatus, errorthrown) { 
        alert("error:" + textstatus + "(" + errorthrown + ")"); 
        setTimeout("waitformsg()", 15000); 
       } 




       }); 

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

      waitformsg(); 
     }); 
    </script> 

가 여기에 최근 매우 비슷한 짓을 한 getdata.php 파일

<?php 
include("../model/includes/classes.php"); 

$filename='data.php'; 

$lastmodif=isset($_GET['timestamp'])?$_GET['timestamp']:0; 
$currentmodif=filemtime($filename); 

while($currentmodif<=$lastmodif){ 
    usleep(10000); 
    clearstatcache(); 
    $currentmodif=filemtime($filename); 
} 

$response=array(); 
$response['msg']=file_get_contents($filename); 
$response['timestamp']=$currentmodif; 
echo json_encode($response); 
?> 
+0

스택 오버플로에 오신 것을 환영합니다. 질문을 명확히하면 대답을 얻는 데 도움이됩니다. ajax를 사용하여 서버를 폴링하는 것으로 가정되는 웹 페이지 (자바 스크립트의 클라이언트 응용 프로그램이라고도 함)를 만드는 것 같습니다. getdata.php에 대한 첫 번째 아약스 요청은 이미 테이블에 저장된 모든 메시지를 검색하고 이후 요청은 가장 최근의 요청 이후에 나타난 새 메시지를 검색하려는 것으로 보인다. 그 맞습니까? 또한,'messages' 테이블의 정의를 보여주십시오. –

+0

@OllieJones 답장을 보내 주셔서 감사합니다.이 질문을 해결할 수있는 마지막 희망입니다. 맞습니다. 긴 폴링 기법을 사용하여 채팅 응용 프로그램을 작성하고 있습니다 .Messaes 테이블은 ID,받는 사람, 메시지, 시간 항목. –

답변

1

입니다. 내가 더 많이 DB에서 모든 항목을 얻을 수 where 절에 쿼리를 가지고있는 getData.php 파일

recentFunction(container, lastDate){ 
    var lastDate = ""; 

    return $.ajax({ 
     type: "POST", 
     url: "getData.php", 
     cache: false, 
     data: { 'request': 'recent', 
      'param': lastDate }, 
     dataType: "json", 
     success: function(data){ 
      if(data != null){ 
       $.each(data, function(key, value){ 
        if(key == 0){ 
         lastDate = value['date_added']; 
        } 
        var html = "some html here"; 
        // append html to dom element here 
           // and delete any old items here if needed 
       }); 
      } 
     }, 
     complete: function(){ 
      setTimeout(function(){recentFunction(container, lastDate)}, 7000); 
     } 
    }); 
} 

: 나는 일반 XMLHttpRequest를 대신 jQuery를 아약스 호출을 사용 않았지만 아이디어는 동일합니다 최근 요소보다 최근. $ lastDate의 기본값은 0으로 설정되어 있으므로 날짜를 제출하지 않으면 모든 항목이 반환됩니다.

<?php 

$lastDate = 0; 
$recent = array(); 
$recentQuery = "SELECT id, date FROM someTable WHERE date > '" . $lastDate . "'"; 
$recentResults = $db->query($recentQuery); 

while($r = $recentResults->fetch_array(MYSQLI_ASSOC)){ 
     $recentMovies[] = $r; 
} 

echo json_encode($recentMovies); 

?> 
+0

감사합니다.하지만 문제는 어디서 어떻게 쉘을 getdada.php에 SQL 문을 넣는 것입니까? –

+0

당신이 그것을 어디에 두어도 상관 없습니다. 평소처럼 SQL 쿼리를 실행하고, 데이터로부터 배열을 만들고 (아마도 여러 쿼리로부터) 배열을 출력하면됩니다.마지막 줄은 "echo json_encode ($ output);"입니다. 원하는 경우 XML 또는 텍스트 만 출력 할 수 있습니다. – DominicM

+0

전체 예제를 보려면 edit를 참조하십시오. – DominicM