2017-08-08 28 views
3

我正在使用PHP和MySQL構建一個(非常基本的)應用程序。此應用程序的目的是在網頁上顯示「實時」數據交易。這些事務來自MySQL數據庫中的transactions表。使用PHP和MySQL的服務器端事件

到目前爲止,我可以檢索和網頁上顯示的數據。不過我期待看到的數據只刷新當新的交易被插入到transactions表?

當前活動饋送顯示最後一條記錄,直到插入新的事務,此循環。

我的代碼到目前爲止;

transactions.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>HTML5 Server-Sent Events</title> 
    <script type="text/javascript"> 
     window.onload = function(){ 
      var source = new EventSource("transactions.php"); 
      source.onmessage = function(event){ 
       document.getElementById("result").innerHTML += "New transaction: " + event.data + "<br>"; 
      }; 
     }; 
    </script> 
</head> 
<body> 
    <div id="result"> 
     <!--Server response will be inserted here--> 
    </div> 
</body> 
</html> 

transactions.php

<?php 
include 'conn.php'; // database connection 

header("Content-Type: text/event-stream"); 
header("Cache-Control: no-cache"); 

$query = "SELECT TimeStamp, CardNo FROM transactions ORDER BY TimeStamp DESC LIMIT 1"; 
// `TimeStamp` is in the format YYYY-MM-DD H:i:s 
if ($result = $conn->query($query)) { 
    $row = $result->fetch_assoc(); 
    echo "data: " . $row['CardNo'] . "\n\n"; 
} 
flush(); 
?> 

我一直在關注this tutorial如果有什麼差別。

我的問題;

  • 如何僅在插入新交易時刷新實時供稿
  • 活動飼料目前每3秒刷新一次,這個套餐在哪裏?

任何幫助表示讚賞。

+0

您的查詢看起來像它會從交易表中獲取所有行。但你只有每一個從結果集中獲取一行??????這可能總是相同的行,但不一定是第一個或最後一個輸入到表 – RiggsFolly

+0

基於這段代碼,你可能需要在每次檢索值時存儲最新的id,並檢查id是<新添加..也基於您當前的代碼,我沒有看到任何代碼刷新每3秒atm .. – Naruto

+0

您的服務器PHP代碼應該在一個循環。循環應該以某種方式檢查新條目,並且只在發現新條目時才發送。它是通過連續循環提供_Message Pump_的服務器。 JavaScript只是對來自服務器PHP代碼 – RiggsFolly

回答

0

你缺少服務器端的幾件事情,使這項工作。

首先,正如@RiggsFilly指出的那樣,您需要在語句中使用WHERE子句。條件應該是查找比上次發送的更新的的交易。

對於這一點,你需要保持跟蹤的最後發送消息的時間戳的。

如果現在使用條件的查詢返回結果,則服務器應只發送消息。

最後,檢查新事務併發送消息的整個例程必須保持循環。

<?php 
include 'conn.php'; // database connection 

header("Content-Type: text/event-stream"); 
header("Cache-Control: no-cache"); 

$query = "SELECT TimeStamp, CardNo FROM transactions WHERE TimeStamp > ?"; 
$stmt = $conn->prepare($query); 
$ts = time(); 

while(true) 
{ 
    if ($result = $stmt->execute([$ts])) { 
     $row = $result->fetch_assoc(); 
     echo "data: " . $row['CardNo'] . "\n\n"; 
     $ts = $row['TimeStamp']; 
     flush(); 
    } 
    sleep(2); 
} 
+0

是的,那更像是它 – RiggsFolly

+0

感謝這個詳細的答案@marekful,我很感激。但是,當我使用您提供的代碼時,我在屏幕上看不到任何數據,只是一個白頁。你有什麼建議可以解決這個問題嗎?如果這有什麼區別,我數據庫中的'TimeStamp'格式爲'YYYY-MM-DD H:i:s'。 – TheOrdinaryGeek

+0

另外,我不需要在查詢中將「綁定」到佔位符「?」?謝謝 – TheOrdinaryGeek

-1
  1. 我怎麼能刷新插入新的交易,只有當活飼料?

    我不清楚這個問題。

    transactions.php總是返回事務表的最後一條記錄。

    如果你想從交易表中顯示新插入的記錄,您必須驗證添加到您的腳本,客戶端或服務器端

    下面是檢查查詢事務表修改?

    SELECT update_time FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable' and update_time = 'your validation time'; 
    
  2. 現場直播目前刷新每3秒左右,這是哪裏設置?

    通常,瀏覽器在連接關閉時自動重新連接到事件源,但可以從客戶端或服務器取消該行爲。 要取消來自客戶端的數據流,只需撥打:source.close();