2016-01-16 22 views
1

這是可能的,如果的$新值改變,則VAR updateChart功能重裝一次,然後再它轉到VAR檢查功能,再有它的情況相同。使用setInterval的時候如果條件爲True

var updateInterval = 3000; 
    var updateChart = function() { 
     var check = function() { 
     if(<?php echo $new; ?>).change(function(){ 
      setInterval(function(){updateChart()}, 1000); 
     }); 
     } 
    dps.push(<?php echo $str; ?>); 
    chart.render(); 
}; 

將不勝感激 謝謝。

+0

這段代碼對我沒有任何意義:你應該知道PHP部分一旦被創建就執行並回顯出來,所以'$ new'元素永遠不會通過PHP進行更新。 'if()。change()'塊會立即被觸發,因爲它會觸發change事件,然後執行內部代碼。你正在定義一個名爲'check()'的函數,但是在你的發佈代碼中你並沒有執行它。 – SaschaM78

+0

是的,我在'.change()'函數中遇到了問題,但是我怎麼才能使用這個語句,當'$ new'值是變化時,這意味着num_rows增加,那麼UpdateChart函數就會執行。 – Lakshya

+0

我仍然不確定我是否正確地得到了你,但我會給你一個有希望的答案。 – SaschaM78

回答

1

所以基本上你想在服務器端寫入一些值的時候更新圖表,對嗎?正如我的評論中所提到的,在您的JS塊中使用PHP語句將不起作用,因爲PHP代碼將在頁面加載時運行,並且之後不會更改。相反,你應該用一個兩步走的方法:

  • 使用重複的AJAX調用輪詢更改
  • 創建報告改變

JS代碼PHP頁面(使用Jquery):

window.setInterval(function() { 
    $.ajax('change-listener.php', { 
    success: function(data) { 
     if (data.changed) { 
     for(var i in data.newValue) { 
      dps.push(data.newValue[i]); 
     } 
     chart.render(); 
     } 
    } 
    }); 
}, 3000); 

檢查WH ICH行已經寫在給定的時間跨度(假設你的表,你正確記錄到有timestamp),並通過JSON返回相應的值給JS腳本:

PHP代碼:

$query= 'SELECT strValue FROM [YOURTABLE] WHERE created > DATE_SUB(now(),INTERVAL 3 SECOND)'; 

$data= array(); 
if ($result = $mysqli->query($query)) { 
    if (mysqli_num_rows($result)) { 
     $data['changed']= TRUE; 
     while($obj = $result->fetch_object()){ 
      $data['newValues'][]= $obj->strValue; 
     } 
    } else { 
     $data['changed']= FALSE; 
    } 
} 
$result->close(); 

header('Content-Type: application/json'); 
print json_encode($data); 

一種替代的方法是將新創建的值存儲在用戶的會話內:

PHP代碼,第1部分(它處理存儲○腳本內部˚F新值):

session_start();  
$_SESSION['newValues'][]= $str; 

PHP代碼,第2部分(而不是輪詢數據庫,輪詢會話):

session_start(); 
if (isset($_SESSION['newValues'])) { 
    $data['changed']= TRUE; 
    $data['newValues']) $_SESSION['newValues']; 
    unset($_SESSION['newValues']; 
} else { 
    $data['changed']= FALSE; 
} 

第二種方法是純的單用戶方案:如只要PHP腳本輪詢更改,就會返回一次更改,然後重置更改列表以避免兩次返回相同的值。

+0

謝謝你給予這麼好的答案我真的很感謝你。但現在問題是我正在爲活動籃球比賽制作圖表,我將時間格式渲染爲 '[{「x」:new Date(0000,00,00,00,00,30),「y」 :2},' 如果我把它轉換成EncodeJson然後它呈現 '[{「x」:「new Date(0000,00,00,00,00,30)」,「y」:2} ,' 其中畫布JS不選擇格式,所以我使用'preg_replace'去除雙引號,然後我再次嘗試渲染圖表 – Lakshya

+0

我知道它有點難我希望我們可以做TeamViewer,以便我能夠告訴你我真的很痛苦。如果我們能做到TeamViewer請通知我。 – Lakshya

+0

對不起,我目前還沒有安裝TeamViewer。你似乎再次混合語言,你不應該傳遞任何字符串,應該在接收端用'eval()'等方式轉換,這會導致某些問題。相反,在服務器端創建日期(即'$ date = new Date();')並將其與您的JSON數據一起傳遞('print json_encode(array('x'=> $ date,'y'=> 2));')。 – SaschaM78