Files
webprogrammierung/php/model/DatabaseCommentManager.php
T
2026-06-15 21:45:17 +02:00

174 lines
4.1 KiB
PHP

<?php
require_once "CommentManagerDAO.php";
require_once "Comment.php";
/**
* Verwaltet die Speicherung und das Laden von Kommentaren
* über eine SQLite-Datenbank.
*
* @author Caroline Schulte
*/
class DatabaseCommentManager implements CommentManagerDAO
{
private static $instance = null;
/**
* Erstellt die Kommentartabelle,
* falls diese noch nicht existiert.
*/
public function __construct()
{
try {
$db = $this->getConnection();
$db->exec("
CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
article_id INTEGER NOT NULL,
author TEXT NOT NULL,
content TEXT NOT NULL,
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
");
unset($db);
} catch (PDOException $e) {
throw new RuntimeException(
"Kommentardatenbank konnte nicht erstellt werden."
);
}
}
/**
* Baut die Verbindung zur SQLite-Datenbank auf.
*
* @return PDO Datenbankverbindung
*/
private function getConnection()
{
try {
$dsn = 'sqlite:' . __DIR__ . '/../../db/comments.db';
$db = new PDO($dsn, null, null);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
} catch (PDOException $e) {
throw new RuntimeException(
"Verbindung zur Kommentardatenbank fehlgeschlagen."
);
}
}
/**
* Gibt die Singleton-Instanz zurück.
*
* @return DatabaseCommentManager
*/
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new DatabaseCommentManager();
}
return self::$instance;
}
/**
* Speichert einen neuen Kommentar
* zu einem Beitrag.
*
* @param int $articleId ID des Beitrags
* @param string $author Autor des Kommentars
* @param string $content Inhalt des Kommentars
*
* @return void
*/
public function addComment(
$articleId,
$author,
$content
) {
try {
$db = $this->getConnection();
$sql = "
INSERT INTO comments (
article_id,
author,
content
)
VALUES (
:articleId,
:author,
:content
)
";
$command = $db->prepare($sql);
$command->execute([
":articleId" => $articleId,
":author" => $author,
":content" => $content
]);
} catch (PDOException $e) {
throw new RuntimeException(
"Kommentar konnte nicht gespeichert werden."
);
}
}
/**
* Lädt alle Kommentare eines Beitrags.
*
* @param int $articleId ID des Beitrags
*
* @return Comment[]
*/
public function getCommentsByArticle(
$articleId
) {
try {
$db = $this->getConnection();
$sql = "
SELECT *
FROM comments
WHERE article_id = :articleId
ORDER BY created DESC
";
$command = $db->prepare($sql);
$command->execute([
":articleId" => $articleId
]);
$comments = [];
while ($row = $command->fetch(PDO::FETCH_ASSOC)) {
$comments[] = new Comment(
$row["id"],
$row["article_id"],
$row["author"],
$row["content"],
$row["created"]
);
}
return $comments;
} catch (PDOException $e) {
throw new RuntimeException(
"Kommentare konnten nicht geladen werden."
);
}
}
}