2012-11-30 38 views
7

經過一週的搜索和搜索後,我很難找到關於從數據庫表中長時間輪詢的單個教程,而不是從名爲data.text的平面文本文件中查找。目前,我手動編寫data.text中的任何內容,並立即出現在瀏覽器中。使用數據庫數據進行長輪詢?

這是一個問題:使用數據庫的長輪詢?即使在StackOverflow中也沒有正確回答。 (我發現很多在這裏,但徒勞的)。這個例子也在這裏 filemtime alternative for MySQL

如何修改訪問getdata.php,使其能夠從數據庫中獲取數據?

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

信息表如下

id  fro to mesg  time status last_modified 

這裏我列出一個例子。 在這個例子中,正在使用三個文件。

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

是否有需要作出第四個文件,從數據庫中獲得的數據(MySQL的)?如果不是,那麼getdata.php或data.text中需要進行哪些類型的更改才能使用數據庫中的動態數據?

這裏是我的Javascript

<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

歡迎來到Stack Overflow。如果你澄清你的問題,它會幫助你得到答案。看起來您正在創建一個網頁(也稱爲Javascript中的客戶端應用程序),它應該使用ajax來輪詢您的服務器。看來你需要第一個到getdata.php的ajax請求來檢索已經存儲在你的表中的所有消息,以及後續的請求來檢索自最近一次請求以來出現的任何新消息。那是對的嗎?另外,請顯示「消息」表的定義。 –

+0

@OllieJones謝謝你的回覆。你在我看來是解決這個問題的最後希望。當然,我是使用長輪詢技術建立聊天應用程序.Messaes表只是一個包括id,to,from,message,時間專欄。 –

回答

1

我已經做了非常類似的東西最近。我沒有使用jQuery阿賈克斯調用,而不是通用的XMLHttpRequest的,但這個想法是一樣的:

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); 
     } 
    }); 
} 

訪問getdata.php文件我有查詢與該會從數據庫是更加任何項目where子句最近比最後一個元素。 $ 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

謝謝。但問題是,我在哪裏和如何將sql語句放在getdada.php中? –

+0

放置它真的沒關係。只需像往常一樣執行SQL查詢,從數據構建數組(可能來自多個查詢)並輸出結果數組。最後一行只是「echo json_encode($ output);」我想你也可以輸出XML或只是文本,如果你想。 – DominicM

+0

另請參閱編輯完整示例。 – DominicM

相關問題