linkDB(); $sql = "SELECT t.*, e.name as event_name, e.start_date, e.end_date, e.ticket_price, l.city as location_city, l.street as location_street, l.house_number as location_house_number FROM ticket t JOIN event e ON t.event_id = e.event_id JOIN location l ON e.location_id = l.location_id ORDER BY t.purchase_date DESC;"; try { $sth = $pdo->prepare($sql); $sth->execute(); return $sth->fetchAll(\PDO::FETCH_ASSOC); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Lesen der Tickets.", $e); die; } } public function getUserTickets($user_id) { $pdo = $this->linkDB(); $sql = "SELECT t.*, e.name as event_name, e.start_date, e.end_date, e.ticket_price, l.city as location_city, l.street as location_street, l.house_number as location_house_number FROM ticket t JOIN event e ON t.event_id = e.event_id JOIN location l ON e.location_id = l.location_id WHERE t.user_id = :user_id ORDER BY t.purchase_date DESC;"; $params = [":user_id" => $user_id]; try { $sth = $pdo->prepare($sql); $sth->execute($params); return $sth->fetchAll(\PDO::FETCH_ASSOC); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Lesen der Benutzer-Tickets.", $e); die; } } public function buyTicket($data) { $pdo = $this->linkDB(); // First check if the event still has available tickets $checkSql = "SELECT e.max_tickets, COUNT(t.ticket_id) as sold_tickets FROM event e LEFT JOIN ticket t ON e.event_id = t.event_id WHERE e.event_id = :event_id GROUP BY e.event_id, e.max_tickets"; try { $checkStmt = $pdo->prepare($checkSql); $checkStmt->execute([':event_id' => $data['event_id']]); $eventInfo = $checkStmt->fetch(\PDO::FETCH_ASSOC); if (!$eventInfo) { throw new \Exception("Event nicht gefunden."); } if ($eventInfo['sold_tickets'] >= $eventInfo['max_tickets']) { throw new \Exception("Alle Tickets für dieses Event sind bereits verkauft."); } } catch (PDOException $e) { throw new \Exception("Fehler bei der Ticketverfügbarkeitsprüfung."); } $sql = "INSERT INTO ticket (user_id, event_id, purchase_date, valid_until) VALUES (:user_id, :event_id, :purchase_date, :valid_until);"; $params = [ ":user_id" => $data['user_id'], ":event_id" => $data['event_id'], ":purchase_date" => $data['purchase_date'], ":valid_until" => $data['valid_until'] ]; try { $sth = $pdo->prepare($sql); $sth->execute($params); return $pdo->lastInsertId(); } catch (PDOException $e) { throw new \Exception("Fehler beim Kauf des Tickets."); } } public function hasTicket($user_id, $event_id) { $pdo = $this->linkDB(); $sql = "SELECT COUNT(*) as count FROM ticket WHERE user_id = :user_id AND event_id = :event_id;"; $params = [ ":user_id" => $user_id, ":event_id" => $event_id ]; try { $sth = $pdo->prepare($sql); $sth->execute($params); return $sth->fetch(\PDO::FETCH_ASSOC); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler bei der Ticketprüfung.", $e); die; } } public function deleteTicket($ticket_id) { $pdo = $this->linkDB(); $sql = "DELETE FROM ticket WHERE ticket_id = :ticket_id;"; $params = [":ticket_id" => $ticket_id]; try { $sth = $pdo->prepare($sql); $sth->execute($params); return $sth->rowCount(); } catch (PDOException $e) { new \Blog\Library\ErrorMsg("Fehler beim Löschen des Tickets.", $e); die; } } }