2012-04-19 3 views
1

Я разрабатываю веб-приложение, которое проверяет наличие обновлений на сервере и уведомляет пользователя, если таковые имеются. Это альтернатива методу push; фоновый процесс в приложении проверяет файл PHP каждый час, чтобы узнать, есть ли новые дополнения к базе данных MySQL. Если он уведомляет пользователя на главном экране.Сравнение меток времени в PHP/Javascript

У меня есть проблема в сравнении временных меток. Я сохраняю переменную "lastUpdate", которая сообщает, что в последний раз телефон обратился к файлу PHP в локальном хранилище в файле 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 секунд в этом случае. Но значения метки времени перестают меняться после первых двух циклов. Если я попытаюсь немного изменить код, я получу совершенно неожиданные результаты. Я был на этом какое-то время, поэтому любая помощь была бы оценена!

ответ

1

1) Вы начинаете с localStorage.lastUpdate = "1970-01-01 01:00:00"; и отправляете это значение на сервер в качестве параметра GET с именем q.

2) В первый раз это соответствует вашей инструкции if и выполняется $compareTime = time();. Это значение, текущая временная метка, является возвратом JavaScript в качестве свойства JSON lastUpdate.

3) В JavaScript вы выбираете это значение и запускаете localStorage["lastUpdate"] = result["lastUpdate"];, чтобы сохранить его. Проходит десять секунд, и вы делаете другой запрос, теперь с предыдущей меткой времени как параметр q.

4) Ваши статуты других PHP добавляются и присваивают заданную - предыдущую временную метку переменной `$ compareTime. Таким образом, вы используете те же самые данные еще раз для следующего цикла while.

Просто возвращаясь 'lastUpdate' => time(), вместо этого в json_encode() будет делать трюк. Иначе он будет продолжать запрашивать одно и то же время снова и снова.

Однако мне интересно, как вы смешиваете форматы. time() дает актуальную временную карту, например, 1335048166, которая совершенно отличается от «1970-01-01 01:00:00». Если у вас есть метки времени в базе данных, я предлагаю придерживаться одного формата в вашем приложении.

+0

Спасибо ОЧЕНЬ много! – user1152440

Смежные вопросы