2016-08-20 54 views
-1

我想從數據庫表中獲取具有特定時間間隔的數據。數據庫每5秒鐘就會填充一次,所以我需要每隔5秒讀取一次數據。設置超時函數Mysql,While循環以特定時間間隔獲取數據

這是我沒有setTimeout函數的代碼,它顯示了整個結果直到表格被填充的值,但是必須刷新頁面才能在其後填充其他數據。

 <?php 
     $con = mysql_connect("localhost","shsas",""); 

     if (!$con) { 
     die('Could not connect: ' . mysql_error()); 
        } 
     else 
        { 
        <script type="text/javascript"> 
        mysql_select_db("shsas", $con); 
        $sth = mysql_query("SELECT Gaslevel FROM gas"); 
        $rows = array(); 
        $rows['name'] = 'Gaslevel'; 

     setTimeout(function(){ 

      while($r = mysql_fetch_array($sth)) { 
      $rows['data'][] = $r['Gaslevel']; 
      $result = array(); 
      array_push($result,$rows); 
      print json_encode($result, JSON_NUMERIC_CHECK); 

      },5000); 
     } 
    </script> 
     } 
    mysql_close($con); 

    ?> 
+0

使用'AJAX'。就目前而言,您是混合代碼('PHP'&'JavaScript'),它的語法不正確。 – Script47

+0

你***應該從'mysql_ *'切換,因爲它已經[官方](http://php.net/manual/en/migration55.deprecated.php)已棄用。使用['mysqli_ *'](http://php.net/manual/en/book.mysqli.php)或[PDO](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers)** ** [準備語句(http://php.net/manual/en/pdo.prepared-statements.php)。 – Script47

+0

你能告訴我如何做到這一點與我的代碼我真的很新這個PHP –

回答

0

不斷需要刷新數據在我看來,就像使用SSE的理想候選人,就像我在評論中提到的那樣。這個想法是你有一個PHP腳本(gas_sse.php),一旦你的javascript頁面初始化一個連接,就開始工作在一個無限循環中。無限循環有一個sleep調用,並且在規定的時間段內不會執行任何操作(5s) - 在循環內部,您將查詢數據庫以獲取最新信息(並且您可能要編輯sql以便它不返回每次迭代時更大的記錄集,如果數據庫每5秒鐘更新一次新行)

查詢運行後,您可以在將消息發送到JavaScript偵聽器並在客戶端處理它之前處理記錄集你覺得合適。

以下是基本思想的一個未經測試的例子 - 如果有錯誤(並且通常會有,如果沒有測試),那麼我表示歉意。

<?php 
    /* 
     gas_sse.php 
    */ 

    set_time_limit(0); 

    ini_set('auto_detect_line_endings', 1); 
    ini_set('mysql.connect_timeout','7200'); 
    ini_set('max_execution_time', '0'); 

    /* -- Edit to suit your location -- */ 
    date_default_timezone_set('Europe/London'); 

    ob_end_clean(); 
    gc_enable(); 


    /* -- set headers -- */ 
    header('Content-Type: text/event-stream'); /* !important! */ 
    header('Cache-Control: no-cache'); 
    header('Access-Control-Allow-Credentials: true'); 
    header('Access-Control-Allow-Methods: GET'); 
    header('Access-Control-Expose-Headers: X-Events'); 



    /* -- utility function to send formatted sse message -- */ 
    if(!function_exists('sse_message')){ 
     function sse_message($evtname='gas', $data=null, $retry=1000){ 
      if(!is_null($data)){ 
       echo "event:".$evtname."\r\n"; 
       echo "retry:".$retry."\r\n"; 
       echo "data:" . json_encode($data, JSON_FORCE_OBJECT|JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); 
       echo "\r\n\r\n";  
      } 
     } 
    } 



    /* -- How often to send messages -- */ 
    $sleep=5; 




    /* You should use mysqli or PDO instead!!! */ 
    $con = mysql_connect("localhost", "shsas", ""); 
    mysql_select_db("shsas", $con); 




    while(true){ 
     if(connection_status() != CONNECTION_NORMAL or connection_aborted()) { 
      break; 
     } 
     /* Infinite loop is running - perform actions you need */ 



     /* -- Query database -- */ 
     $sql='select `Gaslevel` from`gas` order by `id` desc limit 100;'; 
     $res=mysql_query($sql); 
     $payload=array(); 

     while($rs=mysql_fetch_assoc($res)){ 
      $payload[]=$rs; 
     } 


     /* -- prepare sse message -- */ 
     sse_message('gas', $payload); 



     /* -- Send output -- */ 
     if(@ob_get_level() > 0) for($i=0; $i < @ob_get_level(); $i++) @ob_flush(); 
     @flush(); 


     /* wait */ 
     sleep($sleep); 
    } 



    if(@ob_get_level() > 0) { 
     for($i=0; $i < @ob_get_level(); $i++) @ob_flush(); 
     @ob_end_clean(); 
    } 
?> 

這初始化上交所腳本的總體思路是沿着這些線路的連接你的HTML頁面上:

<script type='text/javascript'> 
    var evtSource = new EventSource("gas_sse.php"); 

    evtSource.onmessage = function(e) { 
     var json=JSON.parse(e.data); 
     /* do stuff with json data */ 
    } 
</script> 
+0

謝謝你真的這是很好的幫助,我會試試這個。 –