Ti mancano un paio di cose sul lato server per farlo funzionare.
Innanzitutto, come ha sottolineato @RiggsFilly, è necessario utilizzare una clausola WHERE nell'istruzione. La condizione dovrebbe essere quella di cercare transazioni più recenti rispetto all'ultimo inviato.
Per questo, devi tenere traccia del timestamp dell'ultimo messaggio inviato.
Il server dovrebbe inviare un messaggio solo se la query, ora con la condizione, restituisce un risultato.
Infine, l'intera routine per verificare la presenza di nuove transazioni e inviare un messaggio se trovato deve essere tenuta in loop.
<?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);
}