By: %s On: %s

%s
", $this->poster_name, date("Y-m-d", strtotime($this->timestamp)), $this->content); if($this->children != null) { for($i = 0; $i < count($this->children); $i++) { $child = $this->children[$i]; $child->display_comment(); } } printf("
"); } /** * Load the child comments to this comment, and recursively their children. */ public function load_children($conn) { // Prepare new statement for selecting all the child comments. $stmt = $conn->prepare("SELECT comment_id, poster_id, timestamp, content, username FROM (blogpost_comments INNER JOIN users ON poster_id = user_id) WHERE blogpost_id = :blogpost_id AND parent_id = :comment_id;"); // Bind and execute the comment select $stmt->bindParam(":blogpost_id", $this->blogpost_id); $stmt->bindParam(":comment_id", $this->comment_id); $stmt->execute(); // Fetch the comments $results_arr = $stmt->fetchall(PDO::FETCH_ASSOC); $comments_arr = []; // Recursively fetch all the child comments for($i = 0; $i < count($results_arr); $i++) { $com = $results_arr[$i]; $commentObj = new BlogpostComment($com["comment_id"], $com["poster_id"], $com["username"], $this->blogpost_id, $com["timestamp"], $com["content"]); $comments_arr[] = $commentObj; $commentObj->load_children($conn); } $this->children = $comments_arr; } /** * Constructor for the BlogpostComment object. * $comment_id GUID of the comment. * $poster_id GUID of the comment author. * $poster_name Name of the comment author. * $blogpost_id GUID of the blogpost this comment is under. * $timestamp Timestamp at comment creation. * $content Content of the comment. */ public function __construct($comment_id, $poster_id, $poster_name, $blogpost_id, $timestamp, $content) { $this->comment_id = $comment_id; $this->blogpost_id = $blogpost_id; $this->poster_id = $poster_id; $this->poster_name = $poster_name; $this->timestamp = $timestamp; $this->content = $content; //printf("New comment %s
%s
%s
%s
%s
%s

", $comment_id, $poster_id, $poster_name, $blogpost_id, $timestamp, $content); } } class Blogpost { public $blogpost_id; public $title; public $content; public $date_posted; public $tags; public $comments; /** * Display the article, or a warning message. */ public function display_article(){ // If a blog with given ID was not found display warning message. if(!$this->title){ printf("

Article not found


I am sorry, but I couldn't find an article with this ID.

"); return; } // Begin the article printf("
"); // Display the blogpost name printf("

%s

", $this->title); // Display the blog metadata printf("
"); // Display tags for($i = 0; $i < count($this->tags); $i++) { $tag = $this->tags[$i]; printf(" %s ", $tag["color"], $tag["name"]); } // Display publish date and end metadata div printf("Published on: %s
", date("Y-m-d", strtotime($this->date_posted))); // Display hrule, article content and end the article printf("

%s
", $this->content); } /** * Display the comments for this post and their children. */ public function display_comments(){ printf("

Comments:

"); for($i = 0; $i < count($this->comments); $i++){ $this->comments[$i]->display_comment(); } printf("
"); } /** * Constructor for the blogpost. * $blogpost_id GUID of the blogpost in the database. * $title Title of the blogpost. * $content Content of the blogpost article. * $date_posted Timestamp at publishing of article. * $tags Array of the tags this article has. * $comments Array of Blogpostcomment objects, * the comments of this article. */ public function __construct($blogpost_id, $title, $content, $date_posted, $tags, $comments){ $this->blogpost_id = $blogpost_id; $this->title = $title; $this->content = $content; $this->date_posted = $date_posted; $this->tags = $tags; $this->comments = $comments; } } /** * Load comments under a given blog. * Returns array of BlogpostComment objects. */ function load_comments($conn, $blogId) { // Prepare new statement for selecting all the "root" comments on the post. $stmt = $conn->prepare("SELECT comment_id, poster_id, timestamp, content, username FROM (blogpost_comments INNER JOIN users ON poster_id = user_id) WHERE blogpost_id = :blogpost_id AND parent_id IS NULL;"); // Bind and execute the comment select $stmt->bindParam(":blogpost_id", $blogId); $stmt->execute(); // Fetch the comments $results_arr = $stmt->fetchall(PDO::FETCH_ASSOC); $comments_arr = []; // Recursively fetch all the child comments for($i = 0; $i < count($results_arr); $i++) { $com = $results_arr[$i]; $commentObj = new BlogpostComment($com["comment_id"], $com["poster_id"], $com["username"], $blogId, $com["timestamp"], $com["content"]); $commentObj->load_children($conn); $comments_arr[] = $commentObj; } return $comments_arr; } /** * Load info about the blog with a given guid and return corresponding * Blogpost object. NULL if blog couldn't be loaded. */ function load_blog($conn, $blogId){ // Prepare and bind statement for gathering blogpost info $stmt = $conn->prepare("SELECT title, content, date_posted FROM blogposts WHERE blogpost_id = :blogpost_id;"); $stmt->bindParam(":blogpost_id", $blogId); // Execute the statement $stmt->execute(); // Fetch the blogpost $result = $stmt->fetch(PDO::FETCH_ASSOC); // If no post with given guid was found, // there is no information to gather, return. if(!$result){ return null; } // Prepare new statement for selecting the tags for a given blogpost $stmt = $conn->prepare("SELECT name, color FROM blogpost_tags INNER JOIN blogpost_has_tag ON blogpost_tags.tag_id = blogpost_has_tag.tag_id WHERE blogpost_id = :blogpost_id;"); // Bind and execute the tag select $stmt->bindParam(":blogpost_id", $blogId); $stmt->execute(); // Fetch the tags $tags_arr = $stmt->fetchall(PDO::FETCH_ASSOC); // Set the variables $blogTitle = $result["title"]; $blogContent = $result["content"]; $datePosted = $result["date_posted"]; $tags = $tags_arr; $comments = load_comments($conn, $blogId); return new Blogpost($blogId, $blogTitle, $blogContent, $datePosted, $tags, $comments); } // Check DB connection if($conn == null){ printf("

Failed DB connection, cannot proceed!

If you see this error in production, please shoot me an email with helpful details.
"); include_once($COMMONS."/footer.php"); die(); } // Get the blog id. $blogId = sanitize_input($_GET["guid"]); // Try to get info about blog if($blogId) { $blogPost = load_blog($conn, $blogId); } // Display the header with title being the blog name, or not found message. display_header($blogPost ? $blogPost->title : "Article not found"); // Display the blog $blogPost->display_article(); $blogPost->display_comments(); include_once($COMMONS."/footer.php"); ?>