2012-04-18 42 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/timestamp,並查看是否有更高id/newer時間戳的任何內容。

因爲你的方法效率很低。您選擇表中的所有記錄,強制mysql/pdo開始從磁盤獲取該數據等等,然後在獲得行數後簡單地將其丟棄。更有效的方法是對select count(*) ...執行並檢查該值。這使得mysql不必從磁盤開始獲取實際的行數據。在某些表類型(特別是myisam)中,count(*)操作非常快。

+0

有一列叫做表中的條件。所以應用程序應該檢查是否有條件= false的行。如果有它應該打印它們。當用戶看到這些行時,他們按下一個按鈕,將值從false更改爲true。因此,條件= false的每一行都被視爲「新數據」。 – user1323294 2012-04-18 05:10:11

+0

我需要顯示用戶的所有數據,而不僅僅是行數。 – user1323294 2012-04-18 06:34:57

1

如果您希望應用程序每10秒檢查一次更改,則必須使用AJAX向服務器上的php文件發出asyncronous請求。在php文件中,您只需要select * from testit where condition=false即可獲得您的「新數據」。這裏有一個鏈接,你可以從這裏學習的基本知識AJAXhttp://www.w3schools.com/ajax/default.asp