2012-04-18 2 views
2

Мне нужно написать приложение, которое проверяет базу данных с внешнего сервера каждые 10 секунд, чтобы узнать, есть ли новые данные. В настоящее время у меня есть javascript, который проверяет, изменил ли данные сервер, сравнив два JSON (старый JSON и новый, извлеченный с сервера), и если он имеет оповещения пользователя. Но это не то, что мне нужно в этом приложении. Пользователь должен быть предупрежден только тогда, когда данные новы, а не когда они были изменены.Как проверить, есть ли новые данные в mysql

Я думал, что, возможно, я мог бы сделать это с помощью PHP-кода, который запрашивает MYSQL, и если запрос num_results равен 0, пока num_results больше 0, когда пользователь получает уведомление. В этом приложении не имеет значения, доступны ли новые данные пользователю в течение 0,1 секунды или 10 секунд, до тех пор, пока пользователь получит его. Это, как я пытался сделать чек MYSQL, но он не работает:

<?php 
include 'config.php'; 

if(isset($_GET['ID'])) { 
    $maxLoop = 20;  
    while($maxLoop--) { 
     $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     try { 
      $sth = $dbh->prepare('select * from testit where id = :id'); 
      $sth->bindParam(':id',$_GET['ID'],PDO::PARAM_INT); 
      $sth->execute(); 
      if($sth->rowCount()>0) { 
       $results = $sth->fetchAll(PDO::FETCH_OBJ); 
       echo '{"key":'. json_encode($results) .'}'; 
       exit; // Found new data, end loop and script 
      } 
     } catch(PDOException $e) { 
      break; 
     } 
     sleep(3);  
    } // end while 
} // end if 

Так как я могу изменить этот код, чтобы заставить его работать, или я должен просто попробовать написать несколько JavaScript, что бы это сделать ? И если да, то как я могу проверить, являются ли данные новыми или нет, вместо того, чтобы просто проверять, изменилось это или нет?

ответ

3

Как вы записываете «новые» данные? есть ли временная метка? поле первичного ключа auto_increment?

Самый простой способ опроса - просто отслеживать последний известный идентификатор/метку времени и посмотреть, есть ли что-либо с более высокой меткой id/newer.

Как ваш метод довольно неэффективен. Вы выбираете ВСЕ записи в таблице, заставляя mysql/pdo начинать получать данные с диска и т. Д., А затем просто выкидывать их после получения числа строк. Более эффективный метод - это сделать с select count(*) ... и проверить это значение. Это не позволяет mysql начать получать фактические данные строки с диска. И в некоторых типах таблиц (в частности, myisam) операция count (*) ОЧЕНЬ быстро.

+0

В таблице есть столбец, называемый условием. Поэтому приложение должно проверить, есть ли какие-либо строки с условием = false. И если есть, это должно их распечатать. Когда пользователи видят эти строки, они нажимают кнопку, которая меняет значения с false на true. Поэтому каждая строка с условием = false считается «новыми данными». – user1323294

+0

, и мне нужно отобразить все данные для пользователя, а не только количество строк. – user1323294

1

Если вы хотите, чтобы ваше приложение проверяло изменения каждые 10 секунд, вам нужно будет использовать AJAX, чтобы сделать asyncronous запросов на php-файл на сервере. В php-файле у вас есть только select * from testit where condition=false, и вы получите свои «новые данные». Вот ссылка, из которой вы можете узнать основы AJAX: http://www.w3schools.com/ajax/default.asp