Te faltan un par de cosas en el lado del servidor para que esto funcione.
Primero, como señaló @RiggsFilly, debe usar una cláusula WHERE en la declaración. La condición debería ser buscar transacciones que sean más nuevas que el último enviado.
Para ello, debe realizar un seguimiento de la marca de tiempo del último mensaje enviado.
El servidor solo debe enviar un mensaje si la consulta, ahora con la condición, devuelve un resultado.
Finalmente, toda la rutina para verificar nuevas transacciones y enviar un mensaje si las encuentra debe mantenerse en un bucle.
<?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);
}