我正在开发一个基于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秒继续运行。但是前两个循环后时间戳值停止变化。如果我尝试更改代码,我会得到完全意想不到的结果。我已经有一段时间了,所以任何帮助都会受到赞赏!
答案 0 :(得分:1)
1)从localStorage.lastUpdate = "1970-01-01 01:00:00";
开始,将该值作为名为q
的GET参数发送到服务器。
2)第一次匹配你的if语句并执行$compareTime = time();
。此值(当前时间戳)作为lastUpdate
JSON属性返回给JavaScript。
3)在JavaScript中,您选择此值并运行localStorage["lastUpdate"] = result["lastUpdate"];
以保存它。十秒钟后,您再次发出请求,现在将前一个时间戳作为q
参数。
4)你的PHP的其他语句启动并将给定的 - previous - timestamp分配给`$ compareTime变量。因此,对于以下while循环,您再次使用相同的数据。
只需返回'lastUpdate' => time()
代替json_encode()即可。否则它会一遍又一遍地要求同一时间。
但是我很好奇你如何混合格式。 time()给出了一个实际的时间映射,如1335048166,这是一种与“1970-01-01 01:00:00”完全不同的格式。如果您在数据库中也有时间戳,我建议您在整个应用程序中坚持使用这种格式。