commit 8804d13f00ad7e9b48fe0a58d69a09cb95f20da4 Author: dalfuss Date: Thu Jul 3 09:13:31 2025 +0200 first commit diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..61e8e9a --- /dev/null +++ b/config/config.php @@ -0,0 +1,6 @@ + + + + + + + + Inserate in <?php echo htmlspecialchars($categoryName); ?> + + + +

Inserate in Kategorie:

+ +
+ Neues Inserat erstellen +
+ + +

Keine Inserate in dieser Kategorie gefunden.

+ + +
+

+

+

Erstellt am:

+ +
+

Kontaktinformationen:

+ +

Name:

+ + +

E-Mail:

+ + +

Telefon:

+ +
+ +
+ + + + + + diff --git a/public/create_advert.php b/public/create_advert.php new file mode 100644 index 0000000..c7d08c3 --- /dev/null +++ b/public/create_advert.php @@ -0,0 +1,253 @@ + 255) { + $errors['description'] = 'Beschreibung darf maximal 255 Zeichen lang sein'; + } + + // Kategorien validieren + if (empty($selectedCategories)) { + $errors['categories'] = 'Mindestens eine Kategorie ist erforderlich'; + } elseif (count($selectedCategories) > 3) { + $errors['categories'] = 'Maximal 3 Kategorien erlaubt'; + } + + // Wenn keine Fehler auftreten, Anzeige erstellen + if (empty($errors)) { + $result = Adverts::createAdvert( + $advertName, + $description, + $selectedCategories, + $userName, + $email, + $telephone + ); + + if ($result) { + $success = true; + // Formularfelder nach erfolgreicher Übermittlung zurücksetzen + $userName = ''; + $email = ''; + $telephone = ''; + $advertName = ''; + $description = ''; + $selectedCategories = []; + } else { + $errors['general'] = 'Fehler beim Erstellen des Inserats. Bitte versuchen Sie es erneut.'; + } + } +} +?> + + + + + + + Inserat erstellen - Blackboard + + + +

Neues Inserat erstellen

+ + +
+ Inserat erfolgreich erstellt! +
+ + + +
+ + +
+

Inserenten-Informationen

+
+
+ + + +
+ +
+ +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ +

Inserat-Informationen

+
+
+ + + +
+ +
+ +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+ + + + diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..416d116 --- /dev/null +++ b/public/index.php @@ -0,0 +1,136 @@ + + + + + + + + Schwarzes Brett + + + +

Schwarzes Brett

+ +
+ Neues Inserat erstellen +
+ +

Kategorien

+ +

Keine Kategorien gefunden.

+ + + + +

Aktuelle Inserate

+ +

Keine Inserate gefunden.

+ + +
+

+

+

Erstellt am:

+ +
+

Kontaktinformationen:

+ +

Name:

+ + +

E-Mail:

+ + +

Telefon:

+ +
+ +
+ + + + diff --git a/src/adverts.php b/src/adverts.php new file mode 100644 index 0000000..fb14eb1 --- /dev/null +++ b/src/adverts.php @@ -0,0 +1,116 @@ +query($sql, [$categoryId]); + $adverts = $db->fetchAll($result); + + // Füge Benutzerinformationen zu jeder Anzeige hinzu + foreach ($adverts as &$advert) { + if (isset($advert['user_id'])) { + $user = Users::getUserById($advert['user_id']); + if ($user) { + $advert['user_name'] = $user['name']; + $advert['user_email'] = $user['email']; + $advert['user_telephone'] = $user['telephone']; + } + } + } + + return $adverts; + } + + // Holt alle Anzeigen sortiert nach Erstellungsdatum + // Gibt ein Array aller Anzeigen zurück + public static function getAllAdverts(): array { + $db = new Database(); + $sql = "SELECT id, name, description, date, user_id + FROM advert + ORDER BY date DESC"; + + $result = $db->query($sql); + $adverts = $db->fetchAll($result); + + // Füge Benutzerinformationen zu jeder Anzeige hinzu + foreach ($adverts as &$advert) { + if (isset($advert['user_id'])) { + $user = Users::getUserById($advert['user_id']); + if ($user) { + $advert['user_name'] = $user['name']; + $advert['user_email'] = $user['email']; + $advert['user_telephone'] = $user['telephone']; + } + } + } + + return $adverts; + } + + // Erstellt eine neue Anzeige in der Datenbank + // Diese Methode erstellt eine neue Anzeige und verknüpft sie mit einem Benutzer und Kategorien. + // Die Benutzerverwaltung wird von der Users-Klasse übernommen. + // + // $name: Der Name der Anzeige + // $description: Die Beschreibung der Anzeige + // $categoryIds: Array von Kategorie-IDs, die mit der Anzeige verknüpft werden sollen + // $userName: Der Name des Benutzers + // $userEmail: Die E-Mail des Benutzers + // $userTelephone: Die Telefonnummer des Benutzers + // Gibt die ID der erstellten Anzeige zurück oder false bei einem Fehler + public static function createAdvert( + string $name, + string $description, + array $categoryIds, + string $userName, + string $userEmail, + string $userTelephone + ): int|false { + $db = new Database(); + + try { + // Prüfe, ob Benutzer mit der angegebenen E-Mail existiert + $userId = Users::getUserIdByEmail($userEmail); + + if ($userId === null) { + // Benutzer existiert nicht, erstelle einen neuen Benutzer + $userId = Users::createUser($userName, $userEmail, $userTelephone); + } + + // Erstelle die Anzeige + $sql = "INSERT INTO advert (name, description, date, user_id) VALUES (?, ?, NOW(), ?)"; + $db->query($sql, [$name, $description, $userId]); + + // Hole die ID der neu erstellten Anzeige + $sql = "SELECT MAX(id) as id FROM advert WHERE name = ? AND user_id = ?"; + $result = $db->query($sql, [$name, $userId]); + $advert = $db->fetchOne($result); + $advertId = $advert['id']; + + // Verknüpfe die Anzeige mit Kategorien + foreach ($categoryIds as $categoryId) { + $sql = "INSERT INTO advert_category (advert_id, category_id) VALUES (?, ?)"; + $db->query($sql, [$advertId, $categoryId]); + } + + return $advertId; + } catch (Exception $e) { + // Fehler protokollieren oder nach Bedarf behandeln + return false; + } + } +} diff --git a/src/categories.php b/src/categories.php new file mode 100644 index 0000000..2d67c47 --- /dev/null +++ b/src/categories.php @@ -0,0 +1,18 @@ +query($sql); + + return $db->fetchAll($result); + } +} diff --git a/src/database.php b/src/database.php new file mode 100644 index 0000000..ef154eb --- /dev/null +++ b/src/database.php @@ -0,0 +1,142 @@ +connection = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME); + + // Verbindung überprüfen + if ($this->connection->connect_error) { + throw new Exception("Connection failed: " . $this->connection->connect_error); + } + + $this->initialize(); + } + + // Führt eine Abfrage mit Prepared Statements aus + // $sql: Die auszuführende SQL-Abfrage + // $params: Parameter für das Prepared Statement + // Gibt ein mysqli_result-Objekt oder einen booleschen Wert zurück + // Wirft eine Exception, wenn die Abfrage fehlschlägt + public function query(string $sql, array $params = []): mysqli_result|bool { + // Prepared Statement mit Parametern + $stmt = $this->connection->prepare($sql); + + if ($stmt === false) { + throw new Exception("Prepare failed: " . $this->connection->error); + } + + // Bestimme den Typen-String für bind_param + $types = ''; + foreach ($params as $param) { + if (is_int($param)) { + $types .= 'i'; + } elseif (is_float($param)) { + $types .= 'd'; + } elseif (is_string($param)) { + $types .= 's'; + } else { + $types .= 'b'; + } + } + + // Parameter binden + if (!empty($params)) { + $stmt->bind_param($types, ...$params); + } + + // Statement ausführen + if (!$stmt->execute()) { + throw new Exception("Execute failed: " . $stmt->error); + } + + $result = $stmt->get_result(); + $stmt->close(); + + return $result ?: true; + } + + // Holt alle Zeilen aus einem Ergebnissatz als assoziatives Array + // $result: Der Ergebnissatz + // Gibt ein Array von Zeilen zurück + public function fetchAll(mysqli_result $result): array { + return $result->fetch_all(MYSQLI_ASSOC); + } + + // Holt eine einzelne Zeile aus einem Ergebnissatz als assoziatives Array + // $result: Der Ergebnissatz + // Gibt die Zeile als assoziatives Array zurück oder null, wenn keine Zeilen vorhanden sind + public function fetchOne(mysqli_result $result): ?array { + $row = $result->fetch_assoc(); + return $row ?: null; + } + + // Initialisiert das Datenbankschema + // + // Erstellt die notwendigen Tabellen, falls sie nicht existieren: + // - user: id, name, email, telephone + // - category: id, name + // - advert: id, name, description, date, user_id + // - advert_category: advert_id, category_id (Viele-zu-viele-Beziehung) + // + // Gibt true zurück, wenn die Initialisierung erfolgreich war + // Wirft eine Exception, wenn die Initialisierung fehlschlägt + public function initialize(): bool { + try { + // Erstelle Benutzer-Tabelle, falls sie nicht existiert + $this->query(" + CREATE TABLE IF NOT EXISTS user ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + telephone VARCHAR(50) NOT NULL + ) + "); + + // Erstelle Kategorie-Tabelle, falls sie nicht existiert + $this->query(" + CREATE TABLE IF NOT EXISTS category ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL + ) + "); + + // Erstelle Anzeigen-Tabelle, falls sie nicht existiert + $this->query(" + CREATE TABLE IF NOT EXISTS advert ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description VARCHAR(255) NOT NULL, + date DATETIME NOT NULL, + user_id INT NOT NULL, + FOREIGN KEY (user_id) REFERENCES user(id) + ) + "); + + // Erstelle Anzeigen-Kategorie-Tabelle, falls sie nicht existiert (Viele-zu-viele-Beziehung) + $this->query(" + CREATE TABLE IF NOT EXISTS advert_category ( + advert_id INT NOT NULL, + category_id INT NOT NULL, + PRIMARY KEY (advert_id, category_id), + FOREIGN KEY (advert_id) REFERENCES advert(id), + FOREIGN KEY (category_id) REFERENCES category(id) + ) + "); + + return true; + } catch (Exception $e) { + throw new Exception("Schema initialization failed: " . $e->getMessage()); + } + } +} diff --git a/src/users.php b/src/users.php new file mode 100644 index 0000000..8286999 --- /dev/null +++ b/src/users.php @@ -0,0 +1,45 @@ +query($sql, [$email]); + $user = $db->fetchOne($result); + + return $user ? (int)$user['id'] : null; + } + + // Erstellt einen neuen Benutzer in der Datenbank + // $name: Der Name des Benutzers + // $email: Die E-Mail des Benutzers + // $telephone: Die Telefonnummer des Benutzers + // Gibt die ID des neu erstellten Benutzers zurück + public static function createUser(string $name, string $email, string $telephone): int { + $db = new Database(); + $sql = "INSERT INTO user (name, email, telephone) VALUES (?, ?, ?)"; + $db->query($sql, [$name, $email, $telephone]); + + // Hole die ID des neu erstellten Benutzers + return self::getUserIdByEmail($email); + } + + // Holt Benutzerinformationen anhand der Benutzer-ID + // $userId: Die ID des Benutzers + // Gibt ein Array mit Benutzerinformationen zurück oder null, wenn nicht gefunden + public static function getUserById(int $userId): ?array { + $db = new Database(); + $sql = "SELECT id, name, email, telephone FROM user WHERE id = ?"; + $result = $db->query($sql, [$userId]); + + return $db->fetchOne($result); + } +}