2013-09-16 30 views
2

我想實現我的intranetwork長輪詢系統,大多數用戶使用IE瀏覽器和一些移動使用過,這就是爲什麼我試圖用長輪詢而不是用websocket來做到這一點。PHP + jQuery的 - 長輪詢與數據庫中的數據不工作(不破環)

我跟着這個視頻http://www.screenr.com/SNH,我編輯了一些代碼來處理我的數據庫。 (火鳥)

這一切似乎都沒問題,但它並沒有打破循環。也許這是一個孩子的錯誤,但我看不到它,這就是爲什麼我需要你的幫助!

下面的代碼:

的jQuery + Ajax的:

var timestamp = null; 

function waitForMsg(){  
    $.ajax({ 
     type: "GET", 
     url: "getData.php?timestamp=" + timestamp, 
     async: true, 
     cache: false, 

     success: function(data){ 
      alert('It Works'); 
      var json = eval('(' + data + ')'); 
      timestamp = json['timestamp']; 
      setTimeout('waitForMsg()',15000); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 
      alert("A - " + XMLHttpRequest + " - error: " + textStatus + " (" + errorThrown + ")"); 
      setTimeout('waitForMsg()',15000); 
     } 
    }); 
} 

$(document).ready(function(){ 
    waitForMsg(); 
}); 

</script> 

訪問getdata.php( 'DATAHORA' 是時間戳字段)

<?php 
    set_time_limit(0); 
    @ini_set("memory_limit",'64M'); 

    require_once('../classes/conexao.php'); 

    $banco = Conexao :: getConexao(); 
    $sql = "SELECT FIRST 1 DATAHORA FROM AGENDAMENTOSBBM ORDER BY DATAHORA DESC"; 
    $res = $banco->execute($sql); 
    $dados = $banco->fetch($res); 
    if($dados) 
     $currentmodif = $dados['DATAHORA']); 
    else 
     $currentmodif = 0; 

    $lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 

    while($currentmodif <= $lastmodif){ 
     usleep(10000); 
     $sql = "SELECT FIRST 1 DATAHORA FROM AGENDAMENTOSBBM ORDER BY DATAHORA DESC"; 
     $res = $banco->execute($sql); 
     $dados = $banco->fetch($res); 
     if($dados) 
      $currentmodif = $dados['DATAHORA']); 
     else 
      $currentmodif = 0; 
    } 

    $response = array(); 
    $response['timestamp'] = $currentmodif; 
    echo json_encode($response); 

?> 

當我插入,更新,或者刪除一些數據,時間戳字段用當前時間戳更新。 我可以看到頁面進入循環,但我不知道爲什麼它永遠不會結束。

我做錯了什麼?

謝謝

+0

'eval()'?爲什麼評價JSON,當jQuery已經有完美的內置JSON處理?還有...爲什麼循環要退出?在你的'success'和'error'代碼路徑中,你無條件地在每次迭代時重新安排'waitForMsg()' - 循環無法退出。如果你想讓它退出,你必須放棄它。 –

+0

@MarcB我只是跟着視頻教程,這就是爲什麼'eval()'和其他。如果我嘗試相同的代碼,但使用文件和'filetime',它就像一個魅力。在此代碼中,如果數據庫中添加了新信息,它應該退出循環並傳遞json值,然後返回到帶有循環的頁面。 – void

回答

2

我最終找到了解決方案。

它非常簡單。我的代碼無法縮小與ibase_close

連接我所做的是改變它關閉時完成查詢過程。 然後在循環中,我需要重新連接服務器。

OMG我怎麼能忘記這一點。

謝謝大家。

1

嘗試$currentmodif = $dados['HORA']);更換$currentmodif = $dados['DATAHORA']); while循環中。

你問一個數組的鍵不存在,這將永遠是零,所以你的循環將永遠運行下去,如果$lastmodif不爲空。

+0

對不起兄弟,但你的答案,我看到我錯誤的SQL行,但無論如何感謝 – void

0

嘗試評估您的查詢並查看它們返回的內容,以便驗證返回的數據並確保數組$dados具有所需的數據和訪問數組$dados的任何數據的密鑰。

+0

如果我使用'var_dump($ dados)'我可以看到它正好返回我所需要的東西。如果我模擬傳遞manualy數據或使用一個標誌來停止'while',它可以工作,但仍然不會對循環內的'$ currentmodif'進行任何更改 – void

1

變化$currentmodif = $dados['DATAHORA']);,請看:

<?php 
set_time_limit(0); 
@ini_set("memory_limit",'64M'); 

require_once('../classes/conexao.php'); 

$banco = Conexao :: getConexao(); 
$sql = "SELECT FIRST 1 DATAHORA FROM AGENDAMENTOSBBM ORDER BY DATAHORA DESC"; 
$res = $banco->execute($sql); 
$dados = $banco->fetch($res); 
if($dados) 
    $currentmodif = $dados['DATAHORA']); 
else 
    $currentmodif = 0; 

$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 

while($currentmodif <= $lastmodif){ 
    usleep(10000); 
    $sql = "SELECT FIRST 1 DATA, HORA FROM AGENDAMENTOSBBM ORDER BY DATA DESC,HORA DESC"; 
    $res = $banco->execute($sql); 
    $dados = $banco->fetch($res); 
    if($dados) 
     $currentmodif = $dados['DATA'].$dados['HORA']; // Before : $dados['DATAHORA']); 
    else 
     $currentmodif = 0; 
} 

$response = array(); 
$response['timestamp'] = $currentmodif; 
echo json_encode($response); 

?> 

我不知道你的數據庫設計的外觀的話,我建議你自己 改變也許你的錯誤是上線。但我不能決定,因爲我沒有時間來解決它,我必須做我的項目。 如果我錯了,我很抱歉。祝你好運

+0

對不起兄弟,但您的答案是我看到我有錯誤的SQL行,但無論如何感謝 – void

1

重寫代碼的MySQL和抓我的頭了,爲什麼它似乎工作得很好後,我發現這個問題:

您需要設置自己的初始var timestamp爲0,而不是空。如果將其設置爲null,jQuery將以字符串「null」(?timestamp = null)的形式發送它。在PHP中,會比較這串「零」到任何數量$currentmodif是,所以最後你將永遠不會進入你的while循環。

+0

我已經嘗試過,它總是相同的。無限循環,什麼都沒有發生:( – void

+0

一旦它進入循環,你是否插入一個新的行到比上一個更高的時間戳?因爲它似乎工作... –

+0

在另一個頁面,我插入數據在表格中有更高的時間戳,或者我更新了一行也有更高的時間戳。查看我的其他評論在這裏,我已經嘗試做manualy,它不工作太 – void

0
var longpollError = false; 
function longPoll(){ 
    $.ajax({ 
     url: "socialPolling", 
     type: 'GET', 
     dataType: 'json', 
     data: {param1: 'value1'}, 
     timeout: 30000 // timeout every 10 sec 
     }).done(function(dataJson) { 

     //Success code goes here 

     }) 
     .fail(function(data) { 
     longpollError = true; //mark this to true if there is an error 

     }).always(function(data) { 
     if(longpollError==false){ //if there is no error request it again 
      setTimeout(function() { 
      longPoll(); 
      }, 3000); 

     } 

     }) 
} 
相關問題