2012-11-30 36 views
7

1週間のグーグルリングと検索の後。私は、data.textという名前のフラット・テキスト・ファイルではなく、データベース・テーブルからの長いポーリングに関するチュートリアルを1つ見つけることも難しいです。現在、私は手動でdata.textに何かを書き、すぐにブラウザに表示されます。データベースデータによるロングポーリング?

これは質問です。データベースを使用したロングポーリング? 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; 
    } 

メッセージテーブルがあります。 この例では、3つのファイルが使用されています。

  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

ようこそスタックオーバーフロー。あなたの質問を明確にすると、答えを得るのに役立ちます。あなたのサーバーをポーリングするためにajaxを使用するはずのWebページ(Javascriptでクライアントアプリケーションとも呼ばれる)を作成しているようです。あなたのテーブルにすでに格納されているすべてのメッセージを取得するgetdata.phpへの最初のajaxリクエストと、最新のリクエスト以降に出現した新しいメッセージを取得するための後続リクエストが必要なようです。あれは正しいですか?また、 'messages'テーブルの定義を表示してください。 –

+0

@OllieJonesあなたのレスポンスをありがとうございます。あなたは私にこの質問を解決するための最後の希望であるようです。長いポーリングテクニックを使用してチャットアプリケーションをビルドしています.Messaesテーブルは、時間の列。 –

答えて

1

です。私は多くであるDBから任意の項目を取得する場所句でクエリを持って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

完全な例については編集を参照してください。 – DominicM

関連する問題