1

サーバー上の更新をチェックし、更新がある場合はユーザーに通知する Web ベースのアプリを開発しています。これは push メソッドの代替手段です。アプリのバックグラウンド プロセスは、PHP ファイルを 1 時間ごとにチェックして、MySQL データベースに新しい追加があるかどうかを確認します。ある場合は、ホーム画面でユーザーに通知します。

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

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 つのループの後、タイムスタンプの値は変化しなくなります。コードを少し変更しようとすると、まったく予期しない結果が得られます。私はしばらくこれに携わってきたので、どんな助けでも大歓迎です!

4

1 に答える 1

1

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

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

3) JavaScript では、この値を取得して実行localStorage["lastUpdate"] = result["lastUpdate"];し、保存します。10 秒が経過すると、以前のタイムスタンプをqパラメーターとして使用して、別の要求を行います。

4) PHP の else ステートメントが開始され、指定された -- 前の -- タイムスタンプが `$compareTime 変数に割り当てられます。したがって、次の while ループでまったく同じデータをもう一度使用します。

'lastUpdate' => time()その json_encode() で代わりに単に返すだけでうまくいきます。そうしないと、同じ時間を何度も要求し続けます。

ただし、フォーマットをどのように混在させるかについては興味があります。time() は、「1970-01-01 01:00:00」とはまったく異なる形式である 1335048166 のような実際の timestmap を提供します。データベースにもタイムスタンプがある場合は、アプリケーション全体でその 1 つの形式に固執することをお勧めします。

于 2012-04-21T22:44:30.577 に答える