2011-01-13 156 views
0

我想從mySQL中獲取一些數據,而無需使用jQuery刷新頁面。有人可以告訴我如何獲取數據,如果任何記錄在MySQL表中更新。例如,以下代碼從數據庫中提取數字計數,如果有人在數據庫中添加一個數字並更新數字,我如何在不刷新頁面的情況下顯示新數字?謝謝。從jQuery獲取mysql數據

<? 
$query = "SELECT number, name FROM members WHERE id=1"; 
$result = mysql_query($query); 

$row = mysql_fetch_array($result); 
$number = $row['number']; ?> 
+3

你不想直接這樣做。您想使用jQuery向PHP腳本發出Ajax請求,然後發出數據庫請求。 JQuery Ajax文檔:http://api.jquery.com/jQuery.ajax/ – 2011-01-13 23:52:12

回答

3

已經提到過兩次了,但我仍然想強調它。你永遠不會希望客戶端能夠直接訪問數據庫。這是一個嚴重的安全風險。

現在來解決。首先,你會想建立一個PHP文件,你可以用ajax來請求。讓我們把這種check.php,它會是這個樣子:

<?php 
// include necessary files to enable connection to the database 
$query = "SELECT number, name FROM members WHERE id=1"; 
$result = mysql_query($query); 

$row = mysql_fetch_array($result); 
$number = $row['number']; 

// send correct content type header of json 
header("Content-Type", "application/json"); 

// we create an array, and encode it to json 
// then echo it out while killing the script 
die(json_encode(array('numbers'=>$number))); 

現在到JavaScript的。該解決方案與Kyle Humfeld類似,但不會使用setInterval,因爲這是一種非常糟糕的做法。這背後的原因是因爲setInterval不會關心你的ajax調用的狀態,如果它已經完成或沒有。因此,如果服務器出現問題,您可能會收到堆疊請求,但這並不好。

因此,爲了防止這種情況,我們改用success -callback的AJAX方法的組合(.getJSON本質上是.ajax的簡寫)和setTimeout創造的東西,就是所謂的polling

$(function(){ 
    // placeholder for request 
    var request = null; 

    // request function 
    var check = function() { 
     request = $.getJSON('check.php', function(data){ 
      // this will log the numbers variable to the dev console 
      console.log(data.numbers); 
      // initiate a timeout so the same request is done again in 5 seconds 
      setTimeout(check, 5000); 
     }); 
    }); 

    // initiate the request loop 
    check(); 

    // if you want to cancel the request, just do request.abort(); 
}); 

而且,有一個更先進的解決方案,使用comet server將數據從服務器推送到客戶端,但在挖掘彗星之前,您應該嘗試讓上述工作先完成。如果你想閱讀這個主題,我建議你看看APE

0

正如@Pekka提到的,您需要對調用db調用的PHP頁面進行AJAX調用。然而,看起來你的問題比這更復雜一點,因爲當插入新記錄時,你想定期檢查並更新(你的頁面的一部分?),對吧?

如果是這樣,你應該能夠使用setInterval()來做到這一點。這是一個原生的javascript函數,基本上只是設置一個間隔(以毫秒爲單位),然後運行一些代碼。 setInterval()setTimeout()不同的是setInterval()重複運行,直到您告訴它停止(使用clearInterval())。

因此,您可以使用它每隔30秒(或任何您喜歡的)進行AJAX調用以查找新記錄並相應地更新結果div。

+0

請不要寬恕`setInterval()`的用法。這是一個非常糟糕的做法!我將展示一個更好的解決方案。 – mekwall 2011-01-14 00:13:38

+0

setInterval具有正數和負數,其他選項(如長輪詢)也如此。如果不瞭解更多關於OP的設置,我不會直接駁斥它。 – zaius 2011-01-14 00:32:43