"Fail"]; if (isLoggedIn() && fileExists($imageID, false) && !empty($title) && !empty($memeText) && !empty($imageID) && $imageID > 0) { $stmtMemeAdd = $mysqli->prepare('INSERT INTO Memes (AuthorID, Title, TextContent, FileID) VALUES (?, ?, ?, ?)'); $stmtMemeAdd->bind_param('issi', $_SESSION['ID'], htmlspecialchars($title), htmlspecialchars($memeText), $imageID); if ($stmtMemeAdd->execute() && $stmtMemeAdd->affected_rows > 0) { $output["Status"] = "Success"; $output["Meme"] = "Funny"; } } return $output; } function renderMeme(int $id, int $authorId, string $title, string $textContent, string $createdAt, string $filePath, string $userNickname, string $meme_template): string { $meme_out = str_replace('__TEMPLATE_MEME_TITLE__', htmlspecialchars($title), $meme_template); $meme_out = str_replace('__TEMPLATE_MEME_AUTHOR__', htmlspecialchars($userNickname), $meme_out); $meme_out = str_replace('__TEMPLATE_MEME_DATE__', htmlspecialchars($createdAt), $meme_out); $meme_out = str_replace('__TEMPLATE_MEME_IMAGE__', '/' . htmlspecialchars($filePath), $meme_out); $meme_out = str_replace('__TEMPLATE_MEME_DELETE_BUTTON__', (isModerator() || $_SESSION['ID'] == $authorId) ? "" : '', $meme_out); $meme_votes = calculateNetVotes($id); $meme_upvote = isLoggedIn() ? "" : ''; $meme_downvote = isLoggedIn() ? "" : ''; $meme_out = str_replace('__TEMPLATE_MEME_VOTES_NUMBER__', $meme_votes, $meme_out); $meme_out = str_replace('__TEMPLATE_MEME_UPVOTE__', $meme_upvote, $meme_out); $meme_out = str_replace('__TEMPLATE_MEME_DOWNVOTE__', $meme_downvote, $meme_out); $meme_out = str_replace('__TEMPLATE_MEME_ID__', $id, $meme_out); return str_replace('__TEMPLATE_MEME_TEXT__', htmlspecialchars($textContent), $meme_out); } function renderMemeGallery(): string { global $mysqli; global $routerConfig; $stmtlist = $mysqli->prepare('SELECT Memes.ID, Memes.Title, Memes.TextContent, Memes.CreatedAt, Memes.AuthorID, Files.Path, Files.Type, Users.Nickname FROM Memes INNER JOIN Users ON Memes.AuthorID = Users.ID INNER JOIN Files ON Memes.FileID = Files.ID'); // Execute the prepared statement $memeID = 0; $authorID = 0; $title = ""; $textContent = ""; $filePath = ""; $fileType = ""; $userNickname = ""; $createdAt = ""; // Bind the result variables $stmtlist->bind_result($memeID, $title, $textContent, $createdAt, $authorID, $filePath, $fileType, $userNickname); $stmtlist->execute(); $meme_gallery_template = file_get_contents($routerConfig['template_dir'] . 'meme_gallery.html'); // Fetch the results $memes_out = ''; $meme_template = file_get_contents($routerConfig['template_dir'] . "meme.html"); while ($stmtlist->fetch()) { if (str_starts_with($fileType, 'image')) { $memes_out .= renderMeme($memeID, $authorID, $title, $textContent, $createdAt, $filePath, $userNickname, $meme_template); } } $meme_add = isLoggedIn() ? file_get_contents($routerConfig['template_dir'] . 'meme_add.html') : ''; $meme_gallery_out = str_replace('__TEMPLATE_MEMES_HERE__', $memes_out, $meme_gallery_template); $meme_gallery_out = str_replace('__TEMPLATE_MEME_ADD__', $meme_add, $meme_gallery_out); // Close the statement $stmtlist->close(); return $meme_gallery_out; } function deleteMeme(int $memeID): array { global $mysqli; $out = ["Status" => "Fail"]; if (isLoggedIn()) { $query = !isModerator() ? 'DELETE FROM Memes WHERE ID = ? AND AuthorID = ?' : 'DELETE FROM Memes WHERE ID = ?'; $stmtDelete = $mysqli->prepare($query); if (!isModerator()) { $stmtDelete->bind_param('ii', $memeID, $_SESSION['ID']); } else { $stmtDelete->bind_param('i', $memeID); } $stmtDelete->execute(); if ($stmtDelete->affected_rows > 0) { $out['Status'] = 'Success'; } $stmtDelete->close(); } return $out; } function voteMeme(int $memeID, bool $isUpvote): array { global $mysqli; $out = ["Status" => "Fail"]; $vote = $isUpvote ? 1 : 0; $memeVoteConn = $mysqli->prepare('INSERT INTO MemeVotes (MemeID, UserID, isUpvote) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE isUpvote = VALUES(isUpvote)'); $memeVoteConn->bind_param('iii', $memeID, $_SESSION['ID'], $vote); $memeVoteConn->execute(); if ($memeVoteConn->affected_rows > 0) { $out['Status'] = 'Success'; } $memeVoteConn->close(); return $out; } function calculateNetVotes(int $memeID): int { global $mysqli; $query = 'SELECT isUpvote FROM MemeVotes WHERE MemeID = ?'; $stmt = $mysqli->prepare($query); $stmt->bind_param('i', $memeID); $stmt->execute(); $result = $stmt->get_result(); $netVotes = 0; while ($row = $result->fetch_assoc()) { $netVotes += ($row['isUpvote'] == 1) ? 1 : -1; } $stmt->close(); return $netVotes; } function getMemeVotes(int $memeID): array { return [ "Status" => "Success", "NetVotes" => calculateNetVotes($memeID) ]; }