2011-01-07 98 views
10

如何檢測對數據庫所做的最新更新,並在發生更改時以靜默方式刷新頁面?如何更新數據庫時刷新頁面?

比方說,對數據庫的訪問是這樣的:

$host = "localhost"; 
$username = "root"; 
$password = "root"; 
$db = mysql_connect($host,$username,$password) or die(mysql_error()); 
mysql_select_db('ccr') or die(mysql_error()); 

任何想法和樣品,將不勝感激。謝謝。

回答

9

這就是我最近如何使用jQuery實現解決方案。

每次發生更新時,PHP都會在數據庫中增加一個字段。

<?php 

// Call this function when data changes 
function update_clients() 
{ 
    mysql_query("UPDATE pageGen SET id = id + 1 LIMIT 1"); 
} 

// Call this function to get the ID to pass to JavaScript 
function get_update() 
{ 
    $result = mysql_query("SELECT id FROM pageGen LIMIT 1"); 
    $update = mysql_result($result, 0, 'id'); 
    return $update; 
} 

?> 

當最初加載頁面,填入一個JavaScript變量與數據庫中的數:

<script type="text/javascript"> 
var pageGenID = 25218603 // generated by PHP 
var processUpdate = function(response) 
{ 
    if (pageGenID < response) 
    { 
     replace_current_data_with_new_via_ajax(); 
     pageGenID = response; 
    } 
} 
// Compare our Page Generate ID against that of the server 
var checkUpdates = function() 
{ 
    serverPoll = setInterval(function() 
    { 
     $.get('script_to_return_latest_pageGenID.php', 
      { lastupdate: 1 }, 
      processUpdate, 'html'); 
    }, 10000) 
}; 

// Check for updates every 10 seconds 
$(document).ready(checkUpdates); 

</script> 
+1

首先,JQuery的補充方式對於這樣一個簡單的任務來說,開銷太多了。如果你要使用AJAX路線,只需使用一個XMLHttpRequest對象。另外,就像我在我的文章中指出的那樣,由於JavaScript或MySQL注入的風險增加,請保留諸如`pageGenID` *服務器端*之類的東西。 – Qix 2011-01-07 20:26:23

0

我相信你在使用PHP時必須輪詢數據庫,PHP在長時間運行的進程中不存在,就像在Java容器中Java Web應用程序可以創建持久連接的情況一樣(理論上)你可能需要使用某種輪詢機制,我的意思是在Javascript中設置一個計時器,或者你的客戶端代碼定期發出請求,就提高效率而言,如果需要,你可以創建一個標誌用戶表並設置標誌以指示自用戶上一次輪詢後數據庫已失效,那麼您的第一次檢查將是該用戶上次更新後發生失效,而不是始終將所有內容都發送給所有人。或者我認爲你需要放棄PHP來完成這項任務。

0

IDEEA:

當您呈現PHP頁面中,你可以通過一個js變量女巫保持一個「當前的數據庫版本」(數字)。在這個頁面上,你每30秒就會發出一次ajax調用,一個女巫可以接受一個新的當前數據庫版本。你測試這兩個,如果你從ajax調用得到的那個更高,那麼這意味着你需要重新加載頁面。

在服務器端,您需要一張表來存儲當前修訂版,每次您從php進行查詢時,都會設置當前修訂版+1(在修訂版數據庫表中)。當您從客戶端收到ajax呼叫時,您會從數據庫中讀取該號碼,然後將其傳遞給無聲。你可以設置一個cronjob,每天都會重置計數器。

1

嚴格地說,這是不可能的。如果事情發生變化,MySQL不會觸發PHP返回PHP。這是不可能的。此外,MySQL使用會話進行操作,因此即使它可以報告數據庫中的更改,也必須使用持久連接才能訪問該類型的觸發器。

現在,如果要執行select語句來檢測數據庫中的更改,那就不同了。根據您想要代碼的「新」方式(取決於您希望如何兼容),您可以使用以下任何一種方式「輪詢」PHP頁面以檢查更改:Comet,AJAX,a永遠幀,或HTML5的新類WebSocket類。

雖然其他人說使用客戶端通過像JavaScript中存儲的數據庫版本這樣的變量來檢測更改,但我建議您僅僅因爲知道如何注入javascript的人可以更改該值,這可能會產生不希望的甚至惡意的結果(甚至取決於如何使用該值,MySQL注入)。

2

這是我做了什麼,我用你標記的答案,但我認爲有幾件事要改變。主頁中的 (如果數據庫中的某些內容發生更改,則要刷新該頁)。 我在我的數據庫中創建了一個名爲setting的表,在這個表中我創建了一個名爲rowCounter的行。 當您檢查的表中的行數已更改時,rowCounter正在更新。 所以我的代碼是在兩個塊。一個給我從設置數字> rowCounter 另一個是腳本給我的表中的當前數字。如果他們不相等,那麼我刷新頁面。

這樣你就可以第一個文件。稱之爲
script_to_return_latest_pageGenID.php

// here you will make you connection query. 

$result = mysql_query("SELECT rowCounter FROM setting WHERE `id`='2'"); 
$update = mysql_fetch_assoc($result); 
     echo implode($update); 

    $count=mysql_query("SELECT `id` FROM log_".$datestamp."")or die(mysql_error); 
    $number = mysql_num_rows($count); 
//echo $number; 

    $countFromSetting=mysql_query("SELECT `rowCounter` FROM setting WHERE id='2'")or die(mysql_error); 
    $numberFromSetting=implode(mysql_fetch_assoc($countFromSetting)); 

    if($number != $numberFromSetting) 
     { 
      mysql_query("UPDATE setting SET `rowCounter`='$number' WHERE `id`='2'")or die(mysql_error); 

     } 


在主網頁你會寫代碼的兩大塊我寫的,你把它的腳本之前。

$countFromSetting=mysql_query("SELECT `rowCounter` FROM setting WHERE id='2'")or die(mysql_error); 
     $numberFromSetting=implode(mysql_fetch_assoc($countFromSetting)); 

此代碼後,你把那個會查詢每隔幾秒鐘PHP頁面,檢查數量不相等,它會刷新頁面的腳本。

var pageGenID = "<?php echo $numberFromSetting; ?>"; 
var processUpdate = function(response) { 


var x=response; 
//console.log(pageGenID); by removing the remarks you will see the compared numbers all the time. 
//console.log(x); 
if (pageGenID != x) 
{ 
    //replace_current_data_with_new_via_ajax(); 
    pageGenID = response; 

    window.location.reload();  
    } 
} 

var checkUpdates = function() 
{ 
    serverPoll = setInterval(function() 
    { 

$.get('script_to_return_latest_pageGenID.php', 
     { lastupdate: 1 }, 
     processUpdate, 'html'); 
    }, 5000) }; 
    $(document).ready(checkUpdates); 
0

這似乎就像你可以使用這樣的事情,用while循環。對於大量的用戶這不會 工作(可能會崩潰PHP或SQL),並在某些時候 你會在你的腳本:復位計數變量

<?PHP 
//initialize the variables somewhere before any of the following. do not use these 
//variables for any other purpose other than the refresh routines: 
$a==0; 
$b==0; 
//First design code within a function to refresh the database a single iteration. 
fuction refresh(){ 
    insert code here to output database; 
     } 

//Now, call function refresh in a loop at the spot in the code 
//where we want to refresh the database. where $b here is equal to 
//the number of times you want the database to automatically refresh 
//before having to reset the variables to 0. 

$b==1 
while ($b!==$a){ 
     refresh(); 
     $a==$a+1; 
     } 

?> 
相關問題