2012-04-19 15 views
1

私は、サーバ上のアップデートをチェックし、もしあればユーザに通知するウェブベースのアプリケーションを開発しています。これはプッシュメソッドの代替方法です。アプリケーションのバックグラウンドプロセスは、毎時PHPファイルをチェックして、MySQLデータベースへの新しい追加があるかどうかを確認します。存在する場合、ユーザにホーム画面に通知する。PHP/Javascriptでタイムスタンプを比較する

問題が発生している部分は、タイムスタンプを比較しています。電話機がJavaScriptファイル内のローカルストレージ内のPHPファイルに最後にアクセスしたことを通知する変数は、"lastUpdate"のままです。電話機が接続するたびに、変数が最後に接続されたときに変数が渡されます。データベースに新しいエントリがあり、タイムスタンプが最後の更新よりも大きい場合、通知カウントが増加します。

PHP:

$lastUpdate = $_GET["q"]; 
//connect to server 

mysql_select_db("dbr", $con); 
$sql="SELECT * FROM notification"; 
$result = mysql_query($sql); 

$updateCount = 0; 
if ($lastUpdate == "1970-01-01 01:00:00") 
{ $compareTime = time();} 
else 
{ $compareTime = intval($lastUpdate); } 

while($row = mysql_fetch_array($result)) 
{ 
    $rowTime = strtotime($row['timeAdded']); 
    if ($rowTime >= $compareTime) 
    { 
     $updateCount++; 
    } 
} 
echo json_encode(array('lastUpdate' => $compareTime, 'numUpdates' => $updateCount,  'passedValue' => $compareTime)); 

はJavaScript:

var timedLoop; 
var timer_is_on=0; 
localStorage.lastUpdate = "1970-01-01 01:00:00"; 
localStorage.numUpdates = 0; 
localStorage.passedValue = ""; //used it for debugging 

function timedCount() 
{ 
    document.getElementById('testContent').innerHTML = "lastUpdate: " + localStorage.lastUpdate; 
    document.getElementById('testContent2').innerHTML = "numUpdates: " + localStorage.numUpdates; 
    document.getElementById('testContent3').innerHTML = "passedValue: " + localStorage.passedValue; 

    contactServer(localStorage.lastUpdate); 
    if(Number(localStorage.numUpdates)>0) 
    {  
     alert("NOTIFICATIONS AVAILABLE"); 
     notifyUser(); 
     localStorage.numUpdates = 0; 
    } 
    document.getElementById('txt').value=new Date(); 
    timedLoop=setTimeout("timedCount()",10000); 
} 

function contactServer(update) 
{ 
    if (window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest();} 
    else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");} 

    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      var result = JSON.parse(xmlhttp.responseText); 
      localStorage["lastUpdate"] = result["lastUpdate"]; 
      localStorage["numUpdates"] = result["numUpdates"]; 
      localStorage["passedValue"] = result["passedValue"]; 
     } 
    } 
    xmlhttp.open("GET","address.php?q="+update,true); 
    xmlhttp.send(); 
} 

問題は、それが私のために働いていないです。私はこれにかなり新しいので、私はそれを正しくやっているかどうか分からない。関数timedCount()は "onload"によって本体にロードされるため、開始時に実行され、この場合は10秒ごとに実行され続けます。しかし、タイムスタンプの値は、最初の2つのループの後で変更を停止します。コードを少し変更しようとすると、私はまったく予期しない結果に陥ります。私はしばらくの間これをしてきたので、どんな助けもありがとう!

答えて

1

1)localStorage.lastUpdate = "1970-01-01 01:00:00";で始まり、その値をqというGETパラメータとしてサーバーに送信します。

2)初めてif文と一致し、$compareTime = time();が実行されます。この値(現在のタイムスタンプ)は、JavaScriptにlastUpdate JSONプロパティとして返されます。

3)JavaScriptでは、この値を選択してlocalStorage["lastUpdate"] = result["lastUpdate"];を実行して保存します。 10秒間が経過し、別の要求が行われ、今度は前のタイムスタンプがqのパラメータとなります。

4)あなたのPHPのelseステートメントが起動し、given - previous - タイムスタンプを `$ compareTime変数に代入します。したがって、次のwhileループに対して、まったく同じデータを再度使用します。

json_encode()の代わりに'lastUpdate' => time()を返すだけで、このトリックが実行されます。それ以外の場合、同じ時間を何度も繰り返し要求し続けます。

しかし、どのようにフォーマットを混在させるのか不思議です。 time()は1335048166のような実際のタイムマップを与えます。これは "1970-01-01 01:00:00"とはまったく異なる形式です。データベースにもタイムスタンプがある場合は、アプリケーション全体でその1つのフォーマットを使用することをお勧めします。

+0

ありがとうございました! – user1152440