Bạn đang thiếu một vài thứ ở phía máy chủ để làm cho việc này hoạt động.
Đầu tiên, như @RiggsFilly đã chỉ ra, bạn cần sử dụng mệnh đề WHERE trong câu lệnh. Điều kiện phải là tìm kiếm các giao dịch mới hơn so với lần gửi cuối cùng.
Vì vậy, bạn cần theo dõi dấu thời gian của tin nhắn được gửi gần đây nhất.
Máy chủ sẽ chỉ gửi một thông báo nếu truy vấn, bây giờ với điều kiện, trả về một kết quả.
Cuối cùng, toàn bộ quy trình kiểm tra các giao dịch mới và gửi tin nhắn nếu được tìm thấy phải được lưu giữ trong một vòng lặp.
<?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);
}