query("SELECT * FROM calendar_events WHERE visibility='public' AND start_datetime >= NOW() ORDER BY start_datetime ASC LIMIT 200"); $rows = $stmt->fetchAll(); function ics_escape(string $s): string { $s = str_replace(["\\", ";", ",", " ", " "], ["\\\\", "\\;", "\\,", "\\n", ""], $s); return $s; } echo "BEGIN:VCALENDAR\r\n"; echo "VERSION:2.0\r\n"; echo "PRODID:-//Tri-State Santa//Schedule//EN\r\n"; echo "CALSCALE:GREGORIAN\r\n"; echo "METHOD:PUBLISH\r\n"; foreach ($rows as $r) { $uid = "event-" . (int)$r['id'] . "@tristate-santa"; $dtStart = (new DateTime($r['start_datetime']))->format('Ymd\THis'); $dtEnd = (new DateTime($r['end_datetime']))->format('Ymd\THis'); $title = ics_escape((string)$r['title']); $desc = ics_escape((string)($r['description'] ?? '')); $loc = ics_escape(trim(($r['city'] ?? '') . (empty($r['state']) ? '' : ', ' . $r['state']))); echo "BEGIN:VEVENT\r\n"; echo "UID:$uid\r\n"; echo "DTSTAMP:" . gmdate('Ymd\THis\Z') . "\r\n"; echo "DTSTART:$dtStart\r\n"; echo "DTEND:$dtEnd\r\n"; echo "SUMMARY:$title\r\n"; if ($desc !== '') echo "DESCRIPTION:$desc\r\n"; if ($loc !== '') echo "LOCATION:$loc\r\n"; echo "END:VEVENT\r\n"; } echo "END:VCALENDAR\r\n";