2017-08-08 12 views
3

PHPとMySQLを使用して(非常に基本的な)アプリケーションを構築しています。このアプリケーションの目的は、Webページに「リアルタイム」のデータトランザクションを表示することです。これらのトランザクションは、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

あなたのクエリが見えます。しかし、あなたは結果セットから1行をフェッチするだけです。常に同じ行になる可能性がありますが、必ずしも最初または最後にテーブルに入力されたものではありません – RiggsFolly

+0

このコードに基づいて、値を取得するたびに最新のIDを格納し、idあなたの現在のコードにも基づいて、3秒ごとに更新されるコードは表示されません。 – 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();

関連する問題