Du saknar ett par saker på serversidan för att få det här att fungera.
Först, som @RiggsFilly påpekade, måste du använda en WHERE-sats i uttalandet. Villkoret bör vara att leta efter transaktioner som är nyare än den senast skickade.
För det måste du hålla reda på tidsstämpeln för det senast skickade meddelandet.
Servern ska bara skicka ett meddelande om frågan, nu med villkoret, returnerar ett resultat.
Slutligen måste hela rutinen för att leta efter nya transaktioner och skicka ett meddelande om det hittas hållas i en slinga.
<?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);
}