Il vous manque quelques éléments côté serveur pour que cela fonctionne.
Tout d'abord, comme @RiggsFily l'a souligné, vous devez utiliser une clause WHERE dans l'instruction. La condition doit être de rechercher les transactions qui sont plus récentes que le dernier envoyé.
Pour cela, vous devez garder une trace de l'horodatage du dernier message envoyé.
Le serveur ne doit envoyer un message que si la requête, maintenant avec la condition, renvoie un résultat.
Enfin, toute la routine pour vérifier les nouvelles transactions et envoyer un message s'il est trouvé doit être maintenue en boucle.
<?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);
}