2016-08-20 4 views
-1

Я хочу получить данные из таблицы базы данных с определенным временным интервалом. База данных заполняется каждые 5 секунд, поэтому мне нужно получить данные с 5-секундными интервалами.Mysql с функцией тайм-аута Set, 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 & html инициализирует соединение. Бесконечный цикл имеет вызов sleep и ничего не будет делать в течение заданного периода времени (5s) - внутри цикла вы запросите базу данных для получения последней информации (и вы, вероятно, захотите отредактировать sql, чтобы она не возвращала более большой набор записей на каждой итерации, если db обновляется новыми строками каждые 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 странице, которая инициализирует соединение с ße сценария общая идея была бы вдоль этих линий:

<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

Спасибо, мужчина действительно это Большая помощь, я попробую это. –