get($redisKey); if ($cachedData !== false && $cachedData !== null) { $rows = json_decode($cachedData, true); if (!empty($rows)) { echo json_encode(array("status" => "success", "message" => $rows)); exit(); } else { jsonError("No ride scam record found"); exit(); } } } catch (Exception $e) { error_log("[get.php] Redis read failed: " . $e->getMessage()); } } // 2. Fallback to SQL Database $sql = "SELECT DATE(driver_ride_scam.dateCreated) AS date, CAST(COUNT(driver_ride_scam.id) AS CHAR) AS count FROM driver_ride_scam INNER JOIN ride ON ride.id = driver_ride_scam.rideID AND (ride.status LIKE 'Cancel%' OR ride.status LIKE 'cancel%' OR ride.status = 'cancelled_no_driver_found') WHERE driver_ride_scam.driverID = :driverID AND driver_ride_scam.dateCreated >= CURDATE() AND driver_ride_scam.dateCreated < DATE_ADD(CURDATE(), INTERVAL 1 DAY) GROUP BY DATE(driver_ride_scam.dateCreated)"; try { $stmt = $con->prepare($sql); $stmt->bindParam(':driverID', $driverID); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // 3. Cache the results in Redis (TTL of 60 seconds) if (isset($redis) && $redis !== null) { try { $redis->set($redisKey, json_encode($rows), 60); } catch (Exception $e) { error_log("[get.php] Redis write failed: " . $e->getMessage()); } } if (!empty($rows)) { // --- FIX IS HERE --- // Your Flutter app looks for d['message']. // We manually create the array with the key "message" to match your app. echo json_encode(array("status" => "success", "message" => $rows)); } else { jsonError("No ride scam record found"); } } catch (PDOException $e) { error_log("[get.php] " . $e->getMessage()); jsonError("An internal error occurred. Please try again later."); } ?>