2017-08-10 20 views
1

Mit PHP und MySQL versuche ich Live-Daten auf einer Webseite anzuzeigen.Serverseitige Ereignisse ohne Duplikate

Bis jetzt kann ich Datensätze aus der Datenbank abrufen und sie alle 3 Sekunden anzeigen. Derselbe Datensatz wird jedoch alle 3 Sekunden angezeigt, bis ein neuer Datensatz eingefügt wurde (d. H. Es gibt Duplikate).

Ich glaube, ich brauche noch weitere Überprüfungen innerhalb meiner while Schleife?

Ich kann nicht nach einem eindeutigen TimeStamp suchen, da es mehrere Datensätze mit demselben Zeitstempel geben wird, das ist vollkommen gültig. Das SeriallNo Feld ist primär, einzigartig und wird nach jedem Einfügen um 1 erhöht - vielleicht kann ich das irgendwie benutzen?

Mein PHP;

$query = "SELECT TimeStamp, CardNo, SerialNo FROM transactions WHERE TimeStamp < ? ORDER BY TimeStamp DESC LIMIT 1"; 

$time = date('Y-m-d H:i:s');  
$stmt = $conn->prepare($query); 
$stmt->bind_param("s", $time); 
$stmt->execute(); 
$result = $stmt->get_result(); 

while($row = $result->fetch_assoc()) { 
    $cardNo = $row['CardNo']; 
    echo "retry: 3000\n\n"; // every 3 seconds 
    echo "data: ".$cardNo. ' '.$row['TimeStamp']. "\n\n"; // card no & timestamp 
} 

Mein HTML;

Ein Beispiel der Datenausgabe auf der HTML-Seite (wie Sie sehen können, werden Duplikate ausgegeben);

New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 02723884 2017-08-10 10:54:39 
New transaction: 02723884 2017-08-10 10:54:39 
New transaction: 02723884 2017-08-10 10:54:39 
New transaction: 02723419 2017-08-10 10:54:49 
New transaction: 02723419 2017-08-10 10:54:49 
New transaction: 02723419 2017-08-10 10:54:49 
New transaction: 02723419 2017-08-10 10:54:49 
New transaction: 02730552 2017-08-10 10:55:01 
New transaction: 02730552 2017-08-10 10:55:01 

Ich möchte, dass es so aussieht (keine Duplikate);

New transaction: 12916064 2017-08-10 10:52:03 
New transaction: 02723884 2017-08-10 10:54:39 
New transaction: 02723419 2017-08-10 10:54:49 
New transaction: 02730552 2017-08-10 10:55:01 

Jede Hilfe wird geschätzt.

+0

Ihre Client-Seite Code könnte Spur der letzten ID halten es angezeigt, und es nicht wieder angezeigt werden, wenn die Daten vom Server die ID in der Sitzung ist. Letzteres ist wahrscheinlich etwas "korrekter", da es den Server daran hindert, doppelte Daten an einen bestimmten Benutzer zu senden. – ADyson

+0

Warum gruppieren Sie sie nicht nach Zeitstempel? – Sand

+0

@Sand die Abfrage gibt nur jeweils 1 Zeile zurück. Und auf jeden Fall gab OP an, dass mehrere Zeilen mit demselben Zeitstempel perfekt gültig sind. – ADyson

Antwort

2

Was möchten Sie tun, ist (in PHP):

Wenn die SerialNo in der Sitzung (dh dies sollte die letzte SerialNo vertreten an den Client gesendet) die gleiche wie die in Ihrer $ row ist, dann Senden Sie die Daten nicht an den Client.

Andernfalls, wenn sie nicht identisch sind, senden Sie die Daten an den Client und speichern Sie die neue Seriennummer in der Sitzung anstelle der alten.

Etwas wie folgt aus:

session_start(); //at the top of the script, ideally. 

//...then, after your query, when you've fetched the row: 
if ($_SESSION["lastSerialNo"] != $row["SerialNo"]) 
{ 
    $_SESSION["lastSerialNo"] = $row["SerialNo"]; //store new "last" serial no in the session 
    //...send data to client as you do now 
} 
else 
{ 
    //probably don't need to do anything here, just don't send the data. 
}