Compare commits

...

36 Commits

Author SHA1 Message Date
NOrtmann1 a5e1fb4c38 css 2026-06-10 17:49:33 +02:00
NOrtmann1 ac2451fe64 Update deleteArticle-controller.php 2026-06-10 17:34:39 +02:00
NOrtmann1 5f9789a884 alerts 2026-06-10 17:28:40 +02:00
NOrtmann1 e0fbd220f0 debugging 2026-06-10 17:23:36 +02:00
NOrtmann1 a0932fed04 debugging 2026-06-10 17:21:28 +02:00
NOrtmann1 42aa908f1c Update deleteArticle-controller.php 2026-06-10 17:20:22 +02:00
NOrtmann1 da9dc0e8fb Update deleteArticle-controller.php 2026-06-10 17:15:29 +02:00
NOrtmann1 36f6396148 Update deleteArticle-controller.php 2026-06-10 17:13:49 +02:00
NOrtmann1 429ecb4e0e Update profile.php 2026-06-10 17:09:13 +02:00
NOrtmann1 8019d9c99a deleteArticle() 2026-06-10 17:06:41 +02:00
NOrtmann1 9f9c92385d Update ArticleManager.php 2026-06-10 16:18:01 +02:00
NOrtmann1 9ecfc3b6f8 Pfadanpassungen 2026-06-10 16:16:40 +02:00
niklas.ortmann d00f2d9d53 Merge pull request 'DatabaseUserManager' (#25) from DatabaseUserManager into dev
Reviewed-on: #25
Reviewed-by: niklas.ortmann <ortmann.niklas@yahoo.de>
2026-06-10 16:15:38 +02:00
NOrtmann1 37a032aa9f Merge branch 'dev' of https://git.gigaworld.ddns.net/niklas.ortmann/webprogrammierung into dev 2026-06-10 16:15:11 +02:00
NOrtmann1 fd8e13eaa9 Update LocalArticleManager.php 2026-06-10 16:14:59 +02:00
niklas.ortmann b5d1e08d22 Merge pull request 'bugfix_updateArticle_missingID & updateArticle Leerzeichen im content' (#28) from bugfix_updateArticle_missingID into dev
Reviewed-on: #28
2026-06-10 16:08:08 +02:00
NOrtmann1 23321f90c2 Update createArticle.php 2026-06-10 16:05:07 +02:00
NOrtmann1 90c6f67c24 Update updateArticle.php 2026-06-10 16:04:06 +02:00
NOrtmann1 7e2b29bfb0 Update updateArticle.php 2026-06-10 16:00:01 +02:00
NOrtmann1 cd6aa80f59 Update updateArticle.php 2026-06-10 15:54:12 +02:00
NOrtmann1 d5fdc9383f Update updateArticle.php 2026-06-10 15:52:12 +02:00
NOrtmann1 53865efc78 redo 2026-06-09 19:06:30 +02:00
NOrtmann1 8cbd442371 unset der Eingaben verschoben 2026-06-09 19:05:04 +02:00
NOrtmann1 f54cf58dc2 Update updateArticle-controller.php 2026-06-09 18:57:26 +02:00
NOrtmann1 ede8e1cb21 Fehlermeldungsweiterleitung setzt nun die id 2026-06-09 18:55:09 +02:00
NOrtmann1 aaff15ee8c Update updateArticle-controller.php 2026-06-09 18:49:14 +02:00
NOrtmann1 bb7c85d770 .idea 2026-06-09 18:49:07 +02:00
NOrtmann1 b7160f4df6 .idea 2026-06-09 15:32:06 +02:00
NOrtmann1 a6b57bc352 Merge branch 'DatabaseArticleManager' into dev 2026-06-09 15:31:59 +02:00
NOrtmann1 70f7e05fe1 Update DatabaseArticleManager.php 2026-06-09 15:30:05 +02:00
NOrtmann1 15f17b7af4 .idea 2026-06-09 15:29:53 +02:00
niklas.ortmann 3c14df129d Create data_sources_history.xml 2026-06-08 12:04:56 +02:00
niklas.ortmann 5660f8d59d .idea 2026-06-08 11:15:42 +02:00
niklas.ortmann 198fefbdf5 Update LocalUserManager.php 2026-06-05 10:35:33 +02:00
niklas.ortmann 135bd7b9cd Update updateArticle.php 2026-06-05 10:33:21 +02:00
niklas.ortmann 4cd0383322 deleteArticle -> Autorisierungsprüfung 2026-06-05 10:31:09 +02:00
13 changed files with 197 additions and 44 deletions
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="dataSourceStorageLocal" created-in="IU-261.24374.151">
<data-source name="articles" uuid="315cb5c9-2b0f-435b-b602-59823b160908">
<database-info product="SQLite" version="3.51.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.51.1.0" dbms="SQLITE" exact-version="3.51.1" exact-driver-version="3.51">
<identifier-quote-string>&quot;</identifier-quote-string>
</database-info>
<case-sensitivity plain-identifiers="mixed" quoted-identifiers="mixed" />
<secret-storage>master_key</secret-storage>
<auth-provider>no-auth</auth-provider>
<schema-mapping>
<introspection-scope>
<node kind="schema" qname="@" />
</introspection-scope>
</schema-mapping>
</data-source>
</component>
</project>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="articles" uuid="315cb5c9-2b0f-435b-b602-59823b160908">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/articles</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>
+2 -3
View File
@@ -53,9 +53,8 @@ if (!isset($_SESSION["user"])) {
<input type="text" id="title" name="title" <input type="text" id="title" name="title"
value="<?php echo htmlspecialchars($_SESSION['old_title'] ?? ''); unset($_SESSION['old_title']); ?>" value="<?php echo htmlspecialchars($_SESSION['old_title'] ?? ''); unset($_SESSION['old_title']); ?>"
placeholder="Titel hier eingeben" required> placeholder="Titel hier eingeben" required>
<textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."> <textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."><?php if (isset($_SESSION['old_content']) && !empty($_SESSION['old_content'])){echo htmlspecialchars($_SESSION['old_content']); unset($_SESSION['old_content']);}elseif (isset($content) && !empty($content)){echo htmlspecialchars($content);}?></textarea>
<?php echo htmlspecialchars($_SESSION['old_content'] ?? ''); unset($_SESSION['old_content']); ?>
</textarea>
</main> </main>
<!-- Seitenleiste --> <!-- Seitenleiste -->
+14
View File
@@ -93,6 +93,9 @@ $isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error);
</div> </div>
<div class="container"> <div class="container">
<?php include_once "includes/alertMessages.php"?>
<h2 class="section-title">Meine Beiträge</h2> <h2 class="section-title">Meine Beiträge</h2>
<div class="articles-list"> <div class="articles-list">
@@ -151,6 +154,17 @@ $isEditMode = (isset($_GET["edit"]) && $_GET["edit"] === "1") || !empty($error);
class="edit-link-button"> class="edit-link-button">
Bearbeiten Bearbeiten
</a> </a>
<form action="php/controller/deleteArticle-controller.php" method="POST">
<input type="hidden" name="id" value="<?php echo htmlspecialchars($userArticle->getID()); ?>">
<button type="submit"
class="button"
onclick="return confirm('Möchtest du diesen Artikel wirklich löschen?');">
Löschen
</button>
</form>
</div> </div>
<?php endforeach; ?> <?php endforeach; ?>
+13 -13
View File
@@ -58,28 +58,27 @@ include_once 'php/controller/showArticle-controller.php';
Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten. Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten.
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "not_found_article"): ?>
<p class="alert-message is-error">
Der zu bearbeitende Artikel wurde nicht gefunden. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php <?php
unset($_SESSION["message"]); unset($_SESSION["message"]);
?> ?>
<input type="text" id="title" name="title" <input type="text" id="title" name="title"
value="<?php value="<?php
if (isset($title) && !empty($title)){echo htmlspecialchars($title); if (isset($_SESSION['old_title']) && !empty($_SESSION['old_title'])){
}elseif (isset($_SESSION['old_title']) && !empty($_SESSION['old_title'])){
echo htmlspecialchars($_SESSION['old_title']); echo htmlspecialchars($_SESSION['old_title']);
unset($_SESSION['old_title']); unset($_SESSION['old_title']);
}elseif (isset($title) && !empty($title)){
echo htmlspecialchars($title);
} }
?>" ?>"
placeholder="Titel hier eingeben" required> placeholder="Titel hier eingeben" required>
<textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."> <textarea id="content" name="content" placeholder="Schreibe deinen Beitrag..."><?php if (isset($_SESSION['old_content']) && !empty($_SESSION['old_content'])){echo htmlspecialchars($_SESSION['old_content']); unset($_SESSION['old_content']);}elseif (isset($content) && !empty($content)){echo htmlspecialchars($content);}?></textarea>
<?php
if (isset($content) && !empty($content)){echo htmlspecialchars($content);
}elseif (isset($_SESSION['old_content']) && !empty($_SESSION['old_content'])){
echo htmlspecialchars($_SESSION['old_content']);
unset($_SESSION['old_content']);
}
?>
</textarea>
</main> </main>
<!-- Seitenleiste --> <!-- Seitenleiste -->
@@ -138,10 +137,11 @@ include_once 'php/controller/showArticle-controller.php';
<label for="tags">Schlagwörter</label> <label for="tags">Schlagwörter</label>
<input type="text" id="tags" name="tags" <input type="text" id="tags" name="tags"
value="<?php value="<?php
if (isset($tags) && !empty($tags)){echo htmlspecialchars($tags); if (isset($_SESSION['old_tags']) && !empty($_SESSION['old_tags'])){
} elseif (isset($_SESSION['old_tags']) && !empty($_SESSION['old_tags'])){
echo htmlspecialchars($_SESSION['old_tags']); echo htmlspecialchars($_SESSION['old_tags']);
unset($_SESSION['old_tags']); unset($_SESSION['old_tags']);
} elseif (isset($tags) && !empty($tags)){
echo htmlspecialchars($tags);
} }
?>" ?>"
placeholder="z.B. Technik, IT (mit Komma trennen)"> placeholder="z.B. Technik, IT (mit Komma trennen)">
+63
View File
@@ -0,0 +1,63 @@
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "internal_error"): ?>
<p class="alert-message is-error">
Es ist ein interner Fehler beim Speichern aufgetreten. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_parameters"): ?>
<p class="alert-message is-error">
Jeder Beitrag muss einen Titel, Kategorie und Inhalt besitzen.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "invalid_title"): ?>
<p class="alert-message is-error">
Der Titel enthält ungültige Zeichen oder erfüllt die Länge von 5-120 Zeichen nicht.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "invalid_content"): ?>
<p class="alert-message is-error">
Der Text erlaubt eine Länge von 10 bis maximal 7.000 Zeichen (ca. 1.000 Wörter).
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "invalid_category"): ?>
<p class="alert-message is-error">
Die ausgewählte Kategorie ist ungültig.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "invalid_tags"): ?>
<p class="alert-message is-error">
Ungültige Schlagworte gefunden. Erlaubt sind nur Buchstaben, Zahlen, Leerzeichen und Bindestriche (2-50 Zeichen).
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "validation_missing"): ?>
<p class="alert-message is-error">
Bei der Validierung deiner Daten ist ein Fehler aufgetreten. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "invalid_category"): ?>
<p class="alert-message is-error">
Diese Kategorie ist nicht gültig.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "missing_id"): ?>
<p class="alert-message is-error">
Die Artikel-ID fehlt oder ist ungültig.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "not_found_article"): ?>
<p class="alert-message is-error">
Der angeforderte Beitrag konnte nicht gefunden werden.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "unauthorized_access"): ?>
<p class="alert-message is-error">
Du hast keine Berechtigung, diesen Beitrag zu bearbeiten oder zu löschen.
</p>
<?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "article_deleted"): ?>
<p class="alert-message is-success">
Der Beitrag wurde erfolgreich gelöscht.
</p>
<?php endif; ?>
<?php
unset($_SESSION["message"]);
?>
+2 -2
View File
@@ -17,12 +17,12 @@ if ($pfad === "register") {
} }
if ($pfad === "logout") { if ($pfad === "logout") {
include_once "content/logout-controller.php"; include_once "php/controller/logout-controller.php";
exit(); exit();
} }
if ($pfad === "deleteAccount") { if ($pfad === "deleteAccount") {
include_once "content/deleteAccount-controller.php"; include_once "php/controller/deleteAccount-controller.php";
exit(); exit();
} }
?> ?>
@@ -0,0 +1,42 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once __DIR__ . "/../model/ArticleManager.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (isset($_SESSION["user_email"])) {
$user = $_SESSION["user_email"];
} else {
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
}
if (isset($_POST["id"]) && !empty($_POST["id"])) {
$id = $_POST["id"];
} else {
$_SESSION["message"] = "missing_id";
header("location: ../../index.php?pfad=profile");
exit();
}
try {
$articleManager = ArticleManager::getInstance();
$articleManager->deleteArticle($id, $user);
} catch (\Exception $e) {
$_SESSION["message"] = $e->getMessage();
header("location: ../../index.php?pfad=profile");
exit();
}
$_SESSION["message"] = "article_deleted";
header("location: ../../index.php?pfad=profile");
exit();
}
+7 -7
View File
@@ -21,7 +21,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!isset($_POST["title"]) ||!isset($_POST["content"]) || !isset($_POST["category"])){ if (!isset($_POST["title"]) ||!isset($_POST["content"]) || !isset($_POST["category"])){
$_SESSION["message"] = "missing_parameters"; $_SESSION["message"] = "missing_parameters";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
}else{ }else{
$title = $_POST["title"]; $title = $_POST["title"];
@@ -33,31 +33,31 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
// -------------------------------- Validierung der Daten: ------------------------- // -------------------------------- Validierung der Daten: -------------------------
if (!articleAuthorValidator($author)) { if (!articleAuthorValidator($author)) {
$_SESSION["message"] = "author_not_valid"; $_SESSION["message"] = "author_not_valid";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
} }
if (!articleTitleValidator($title)) { if (!articleTitleValidator($title)) {
$_SESSION["message"] = "invalid_title"; $_SESSION["message"] = "invalid_title";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
} }
if (!articleContentValidator($content)) { if (!articleContentValidator($content)) {
$_SESSION["message"] = "invalid_content"; $_SESSION["message"] = "invalid_content";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
} }
if (!articleCategoryValidator($category)) { if (!articleCategoryValidator($category)) {
$_SESSION["message"] = "invalid_category"; $_SESSION["message"] = "invalid_category";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
} }
if (!articleTagValidator($tags)) { if (!articleTagValidator($tags)) {
$_SESSION["message"] = "invalid_tags"; $_SESSION["message"] = "invalid_tags";
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
} else { } else {
$cleanedTags = []; $cleanedTags = [];
@@ -83,7 +83,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
$articleManager->updateArticle($id ,$article, $author); $articleManager->updateArticle($id ,$article, $author);
} catch (Exception $e){ } catch (Exception $e){
$_SESSION["message"] = $e->getMessage(); $_SESSION["message"] = $e->getMessage();
header("location: ../../index.php?pfad=updateArticle"); header("location: ../../index.php?pfad=updateArticle&id=$id");
exit(); exit();
} }
$_SESSION["message"] = "article_updated"; $_SESSION["message"] = "article_updated";
+3 -3
View File
@@ -19,7 +19,7 @@ class ArticleManager
$articleManager->addArticle( $articleManager->addArticle(
"Satz des Pythagoras", "Satz des Pythagoras",
"Der Satz des Pythagoras wurde von dem griechischen Philosophen Pythagoras von Samos formuliert und im dritten Jahrhundert vor Christus veröffentlicht. In der beigefügten Abbildung sehen wir ein rechtwinkliges Dreieck...", "Der Satz des Pythagoras wurde von dem griechischen Philosophen Pythagoras von Samos formuliert und im dritten Jahrhundert vor Christus veröffentlicht. In der beigefügten Abbildung sehen wir ein rechtwinkliges Dreieck...",
"max.mustermann", "mustermann@web.de",
"mathe", "mathe",
"Dreiecke, Dreiecksseiten berechnen" "Dreiecke, Dreiecksseiten berechnen"
); );
@@ -28,7 +28,7 @@ class ArticleManager
$articleManager->addArticle( $articleManager->addArticle(
"Tunneleffekt", "Tunneleffekt",
"Der Tunneleffekt ist ein quantenmechanisches Phänomen, bei dem Teilchen...", "Der Tunneleffekt ist ein quantenmechanisches Phänomen, bei dem Teilchen...",
"max.mustermann", "mustermann@web.de",
"physik", "physik",
"Quantenphysik, Energie" "Quantenphysik, Energie"
); );
@@ -37,7 +37,7 @@ class ArticleManager
$articleManager->addArticle( $articleManager->addArticle(
"Datenschutz vs Datensicherheit", "Datenschutz vs Datensicherheit",
"Datenschutz ist in unserer digital vernetzten Welt allgegenwärtig...", "Datenschutz ist in unserer digital vernetzten Welt allgegenwärtig...",
"max.mustermann", "mustermann@web.de",
"informatik", "informatik",
"Daten, DSGVO" "Daten, DSGVO"
); );
+3 -5
View File
@@ -20,10 +20,8 @@ class DatabaseArticleManager implements ArticleManagerDAO {
{ {
if (!file_exists(__DIR__ . '/../../db/articles.db')) { if (!file_exists(__DIR__ . '/../../db/articles.db')) {
try { try {
$user = 'root';
$pw = null; $db = $this->getConnection();
$dsn = 'sqlite:' . __DIR__ . '/../../db/articles.db';
$db = new PDO($dsn, $user, $pw);
$db->exec(" $db->exec("
CREATE TABLE articles ( CREATE TABLE articles (
@@ -149,7 +147,7 @@ class DatabaseArticleManager implements ArticleManagerDAO {
public function deleteArticle($id, $author) public function deleteArticle($id, $author)
{ {
$article = getArticle($id); $article = $this->getArticle($id);
if (empty($article)) { if (empty($article)) {
throw new NotFoundException("not_found_article"); throw new NotFoundException("not_found_article");
} }
+8 -3
View File
@@ -36,14 +36,19 @@ class LocalArticleManager implements ArticleManagerDAO {
* Speichert alle Artikel/Beiträge in der Datei. * Speichert alle Artikel/Beiträge in der Datei.
* @param $articles * @param $articles
* @return void * @return void
* TODO: Exceptions implementieren. * @throws InternalServerErrorException
*/ */
public function saveArticle($articles) private function saveArticle($articles)
{ {
try{
file_put_contents( file_put_contents(
$this->file, $this->file,
json_encode($articles, JSON_PRETTY_PRINT) json_encode($articles, JSON_PRETTY_PRINT)
); );
}catch (Exception $e){
throw new InternalServerErrorException($e->getMessage());
}
} }
public function addArticle($title, $content, $author, $category, $tags) public function addArticle($title, $content, $author, $category, $tags)
@@ -66,7 +71,7 @@ class LocalArticleManager implements ArticleManagerDAO {
public function updateArticle($id, $article, $author) public function updateArticle($id, $article, $author)
{ {
if (empty($article)) { if (empty($article)) {
throw new InternalServerErrorException("internal_error"); throw new NotFoundException("not_found_article");
} }
// Berechtigungsprüfung: // Berechtigungsprüfung:
+2
View File
@@ -162,6 +162,8 @@ class LocalUserManager implements UserManagerDAO {
/** /**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse. * Löscht einen Benutzer anhand seiner E-Mail-Adresse.
* *
* TODO: wenn ein Benutzer gelöscht wird, sollten dann auch seine Beiträge gelöscht werden?
*
* @param string $email E-Mail-Adresse des zu löschenden Benutzers * @param string $email E-Mail-Adresse des zu löschenden Benutzers
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false * @return bool true, wenn der Benutzer gelöscht wurde, sonst false
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können