2012-12-02 43 views
4

我不知道如何搜索,因此我有點迷路(我在這裏看到的兩個主題已關閉)。在數據庫中插入新數據時發出警告用戶

我有一個新聞網站,當數據庫中插入新數據時,我想警告用戶。我想在StackOverflow中這樣做,在這裏我們被警告而不重新加載頁面,或者像在facebook那樣,在沒有重新加載的情況下警告新消息/通知。

這是最好的方法嗎?它是否是某種監聽器,並經常檢查數據庫?這聽起來並不高效......

在此先感謝。

回答

3

您需要javascript ajax和json以及回調函數來不斷檢查。它可以通過推送服務完成,但PHP不好,你需要websockest,等等。facebook使用超時調用。不知道的計算器

refreshInterval = 500 
    refreshTimeout = setTimeout(getNotificationCounts, refreshInterval); 
function getNotifications() { 
     $.ajax({ 
      url : 'path_to_your_php', 
      type : 'POST', 
        data: //put for exampel user_id but it cvan be handled by sesion as well 
      dataType : 'json', 
      success : function(data) { 
       alert('You have'+ data.total +' new messages') 
       refreshTimeout = setTimeout(getNotificationCounts, refreshInterval); //this will check every half of second 
      } 
     }); 
    } 

然後在PHP中,例如你在數據庫與您檢查數據是否是新德DATABSE的標誌。注意格式化和正確的sql轉義

$result=mysql_query("SELECT count(*) as total from myTable where user_id=$_POST['user_id'] AND is_read=0"); 

     //note instad of $_POST you can use session if users are logged in, or however you are handling it 
     $data=mysql_fetch_assoc($result); 
     echo json_encode($data) 

;

之後,您可以創建另一個Ajax調用,在用戶單擊它們時將消息標記爲已讀。或打開一個對話框列表或wahtever

mysql_query("UPDATE myTable WHERE user_id=$_POST['user_id'] SET is_read=1"); 
+0

謝謝你回覆Elijan。我曾考慮過這種超時解決方案。我不知道Facebook使用它。對於具有數千個用戶線程(大量數據庫訪問)的系統來說,這似乎效率不高。我想知道是否有辦法在插入數據時觸發整個當前用戶線程的事件(如notify()),但現在超時解決方案將適合問題,謝謝。 –

+0

@JoãoMenighin那麼,如果你正確地構造數據庫(在我構建的最新用戶應用程序中,我們有通知表,它基本上處理所有東西),並對它進行索引,它也沒有多少開銷(你不查詢用戶線程,但是當用戶線程已創建,您可以向通知表添加條目)。以您想要的方式推送通知的問題是,當時的客戶端需要成爲服務器,Facebook每隔幾秒鐘就會使用一次服務器ping服務器。現在我認爲他們有一個「拉監聽器」,這是一個等待新數據的ajax請求。通過螢火蟲查看。 –

+0

@JoãoMenighin另外谷歌「推通知從PHP」的更多細節如何可以完成沒有ajax請求(如所說的它需要網絡套接字和node.js,所以你仍然必須有後備) –