1

我正在开发一个基于 Web 的应用程序,用于检查服务器上的更新并通知用户是否有任何更新。这是 push 方法的替代方法;应用程序中的后台进程每小时检查一次 PHP 文件,以查看 MySQL 数据库中是否有新添加。如果有它会在主屏幕上通知用户。

我遇到问题的部分是比较时间戳。我保留了"lastUpdate"告诉手机最后一次访问 JavaScript 文件中本地存储中的 PHP 文件的变量。每次电话连接时,它都会将变量传递到上次连接的时间,如果数据库中有任何新条目的时间戳大于上次更新的时间戳,则通知计数将增加。

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 秒运行一次。但时间戳值在前两个循环后停止变化。如果我尝试稍微更改代码,我会得到完全出乎意料的结果。我已经有一段时间了,所以任何帮助将不胜感激!

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"];以保存它。十秒钟过去了,您发出另一个请求,现在使用以前的时间戳作为q参数。

4) 你的 PHP 的 else 语句启动并将给定的 -- 前一个 -- 时间戳分配给 `$compareTime 变量。因此,您在接下来的 while 循环中再次使用相同的数据。

简单地返回'lastUpdate' => time()那个 json_encode() 就可以了。否则它将继续一遍又一遍地请求相同的时间。

但是我很好奇你如何混合这些格式。time() 给出了一个实际的时间图,如 1335048166,它与“1970-01-01 01:00:00”的格式完全不同。如果您在数据库中也有时间戳,我建议您在整个应用程序中坚持使用这种格式。

于 2012-04-21T22:44:30.577 回答