How to develop Projects(BlogApp)
Using PHP and Mysql
Part 12
Module 3: Like / Dislike Feature for Blog Application
🎯 Purpose:
This
module allows users to react to blog posts by either liking or disliking them,
enhancing engagement and providing feedback. It enables toggling between
reactions and displays the like/dislike count for each post.
Functionalities:
1. Like
a Blog Post:
o Users
can express their approval by clicking a "Like" button on a blog
post.
2. Dislike
a Blog Post:
o Users
can express their disapproval by clicking a "Dislike" button on a
blog post.
3. Toggle
Between Like and Dislike:
o Users
who have already reacted to a post can switch between liking or disliking the
post (i.e., they can undo their like and switch to a dislike, or vice versa).
4. View
Like/Dislike Count on Each Post:
o Each
blog post will display the number of likes and dislikes, allowing users to see
the reaction distribution.
Project Structure:
│── /reactions/
│ ├── like_dislike.php
# Handle like/dislike requests
│ ├── reaction_count.php
# Get like/dislike count for blog
Database Table:
reactions
table:
CREATE
TABLE reactions (
id
INT AUTO_INCREMENT
PRIMARY KEY,
blog_id
INT
NOT
NULL,
user_id
INT
NOT
NULL,
reaction ENUM(
'like',
'dislike')
NOT
NULL,
created_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP,
UNIQUE(blog_id, user_id),
-- ensures one reaction per user per blog
FOREIGN KEY (blog_id)
REFERENCES blogs(id)
ON
DELETE CASCADE,
FOREIGN KEY (user_id)
REFERENCES users(id)
ON
DELETE CASCADE
);
blog_id
: The ID of the blog post the user is reacting to.user_id
: The ID of the user who is reacting to the post.reaction
: Stores the type of reaction (either "like" or "dislike").created_at
: Timestamp of when the reaction was made.- UNIQUE constraint:
Ensures a user can only react once per blog post (either a like or a
dislike).
Code Breakdown:
1. like_dislike.php - Handle Like/Dislike
Requests:
This
file will handle the incoming requests for liking or disliking a blog post. It
will check if the user has already reacted to the post and toggle between the
reactions if necessary.
Example
code:
<?php
session_start();
include(
'db.php');
// Include the database connection file
if(
isset(
$_POST[
'action']) &&
isset(
$_POST[
'blog_id'])) {
$user_id =
$_SESSION[
'user_id'];
// Assumed session variable for the logged-in user
$blog_id =
$_POST[
'blog_id'];
$reaction =
$_POST[
'action'];
// Either 'like' or 'dislike'
// Check if the user has already reacted to this blog
$query =
"SELECT * FROM reactions WHERE user_id = ? AND blog_id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"ii",
$user_id,
$blog_id);
$stmt->
execute();
$result =
$stmt->
get_result();
if(
$result->num_rows >
0) {
// User has already reacted, update their reaction
$existing_reaction =
$result->
fetch_assoc()[
'reaction'];
if(
$existing_reaction ==
$reaction) {
// If the user is toggling the same reaction, delete their reaction
$delete_query =
"DELETE FROM reactions WHERE user_id = ? AND blog_id = ?";
$stmt =
$conn->
prepare(
$delete_query);
$stmt->
bind_param(
"ii",
$user_id,
$blog_id);
$stmt->
execute();
}
else {
// If the user is toggling between like and dislike, update the reaction
$update_query =
"UPDATE reactions SET reaction = ? WHERE user_id = ? AND blog_id = ?";
$stmt =
$conn->
prepare(
$update_query);
$stmt->
bind_param(
"sii",
$reaction,
$user_id,
$blog_id);
$stmt->
execute();
}
}
else {
// If the user has not reacted before, insert the reaction
$insert_query =
"INSERT INTO reactions (blog_id, user_id, reaction) VALUES (?, ?, ?)";
$stmt =
$conn->
prepare(
$insert_query);
$stmt->
bind_param(
"iis",
$blog_id,
$user_id,
$reaction);
$stmt->
execute();
}
// Return updated count of likes and dislikes
include(
'reaction_count.php');
}
?>
2. reaction_count.php - Get Like/Dislike
Count:
This
file will return the current like and dislike counts for a specific blog post.
Example code:
<?php
include(
'db.php');
if(
isset(
$_POST[
'blog_id'])) {
$blog_id =
$_POST[
'blog_id'];
// Count likes
$like_query =
"SELECT COUNT(*) AS like_count FROM reactions WHERE blog_id = ? AND reaction = 'like'";
$stmt =
$conn->
prepare(
$like_query);
$stmt->
bind_param(
"i",
$blog_id);
$stmt->
execute();
$like_result =
$stmt->
get_result()->
fetch_assoc();
$like_count =
$like_result[
'like_count'];
// Count dislikes
$dislike_query =
"SELECT COUNT(*) AS dislike_count FROM reactions WHERE blog_id = ? AND reaction = 'dislike'";
$stmt =
$conn->
prepare(
$dislike_query);
$stmt->
bind_param(
"i",
$blog_id);
$stmt->
execute();
$dislike_result =
$stmt->
get_result()->
fetch_assoc();
$dislike_count =
$dislike_result[
'dislike_count'];
// Return counts
echo
json_encode([
'like_count' =>
$like_count,
'dislike_count' =>
$dislike_count
]);
}
?>
Frontend Example:
You
can have buttons for like/dislike in the blog post view and update the counts
dynamically using AJAX.
html
<button
class=
"like-button"
onclick=
"reactToPost('like', blog_id)">Like
</button>
<button
class=
"dislike-button"
onclick=
"reactToPost('dislike', blog_id)">Dislike
</button>
<span
id=
"like-count">0
</span> Likes |
<span
id=
"dislike-count">0
</span> Dislikes
AJAX
Example to Send Like/Dislike Request:
function
reactToPost(
action, blog_id) {
$.
ajax({
url:
'reactions/like_dislike.php',
method:
'POST',
data: {
action: action,
blog_id: blog_id },
success:
function(
response) {
updateReactionCounts(blog_id);
}
});
}
function
updateReactionCounts(
blog_id) {
$.
ajax({
url:
'reactions/reaction_count.php',
method:
'POST',
data: {
blog_id: blog_id },
success:
function(
response) {
const data =
JSON.
parse(response);
$(
'#like-count').
text(data.
like_count);
$(
'#dislike-count').
text(data.
dislike_count);
}
});
}
Conclusion:
This module allows users to interact with blog posts by liking or disliking them. It also ensures that a user can only react once per blog post, and they can toggle between like and dislike. Additionally, the system displays the current like and dislike count for each post to improve user engagement.
8️⃣ Blog Application
✅
Module 4: Comment Section
🎯
Purpose:
Allow users to leave comments on blog posts, creating a space for discussion,
feedback, and engagement.
Functionalities:
1. Post
a Comment:
o Users
can write and submit comments on blog posts.
2. View
Comments:
o All
comments related to a particular blog post are displayed beneath the post.
3. Delete
a Comment (if permitted):
o Users
can delete their own comments.
o Admin
can delete any comment.
4. Reply
to Comments:
o Users
can reply to other users' comments, creating a threaded discussion.
5. Comment
Count:
o Display
the total number of comments under each blog post.
Project Structure:
│── /comments/
│ ├── post_comment.php
# Handle comment posting
│ ├── delete_comment.php
# Handle comment deletion
│ ├── view_comments.php
# Retrieve and display comments for a blog post
│ ├── reply_comment.php
# Handle comment replies
│ └── comment_count.php
# Get comment count for a blog post
Database Table:
comments
table:
CREATE
TABLE comments (
id
INT AUTO_INCREMENT
PRIMARY KEY,
blog_id
INT
NOT
NULL,
user_id
INT
NOT
NULL,
comment TEXT
NOT
NULL,
parent_comment_id
INT
DEFAULT
NULL,
-- For replies, references the original comment
created_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP,
updated_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP
ON
UPDATE
CURRENT_TIMESTAMP,
FOREIGN KEY (blog_id)
REFERENCES blogs(id)
ON
DELETE CASCADE,
FOREIGN KEY (user_id)
REFERENCES users(id)
ON
DELETE CASCADE,
FOREIGN KEY (parent_comment_id)
REFERENCES comments(id)
ON
DELETE CASCADE
);
blog_id
: The ID of the blog post to which the comment belongs.user_id
: The ID of the user who posted the comment.comment
: The actual comment text.parent_comment_id
: For threaded comments, it refers to the ID of the parent comment (if it's a reply).created_at
: Timestamp when the comment was posted.updated_at
: Timestamp when the comment was last updated.
Code Breakdown:
1. post_comment.php - Handle Comment
Posting:
This
file will allow users to post new comments on blog posts.
Example
Code:
<?php
session_start();
include(
'db.php');
// Database connection
if(
isset(
$_POST[
'comment']) &&
isset(
$_POST[
'blog_id'])) {
$user_id =
$_SESSION[
'user_id'];
// Get user ID from session
$comment =
$_POST[
'comment'];
$blog_id =
$_POST[
'blog_id'];
$parent_comment_id =
isset(
$_POST[
'parent_comment_id']) ?
$_POST[
'parent_comment_id'] :
NULL;
// Insert the comment into the database
$query =
"INSERT INTO comments (blog_id, user_id, comment, parent_comment_id)
VALUES (?, ?, ?, ?)";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"iisi",
$blog_id,
$user_id,
$comment,
$parent_comment_id);
$stmt->
execute();
// Redirect back to the blog post or return success message
header(
"Location: blog_post.php?id=" .
$blog_id);
exit;
}
?>
2. delete_comment.php - Handle Comment
Deletion:
This
file will handle the deletion of comments. It will check if the user is the
author of the comment or if the user is an admin before allowing the deletion.
<?php
session_start();
include(
'db.php');
// Database connection
if(
isset(
$_POST[
'comment_id'])) {
$user_id =
$_SESSION[
'user_id'];
$comment_id =
$_POST[
'comment_id'];
// Check if the user is the owner of the comment or an admin
$query =
"SELECT * FROM comments WHERE id = ? AND (user_id = ? OR user_id = ?)";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"iii",
$comment_id,
$user_id,
1);
// Assumed 1 is admin ID
$stmt->
execute();
$result =
$stmt->
get_result();
if(
$result->num_rows >
0) {
// User is the owner or an admin, delete the comment
$delete_query =
"DELETE FROM comments WHERE id = ?";
$stmt =
$conn->
prepare(
$delete_query);
$stmt->
bind_param(
"i",
$comment_id);
$stmt->
execute();
}
// Redirect back to the blog post
header(
"Location: blog_post.php?id=" .
$_POST[
'blog_id']);
exit;
}
?>
3. view_comments.php - Retrieve and Display
Comments:
This
file will fetch all the comments for a specific blog post and display them,
including replies to comments.
Example
Code:
<?php
include(
'db.php');
if(
isset(
$_GET[
'blog_id'])) {
$blog_id =
$_GET[
'blog_id'];
// Fetch main comments (not replies)
$query =
"SELECT c.id, c.comment, c.created_at, u.name
FROM comments c
JOIN users u ON c.user_id = u.id
WHERE c.blog_id = ? AND c.parent_comment_id IS NULL
ORDER BY c.created_at DESC";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"i",
$blog_id);
$stmt->
execute();
$result =
$stmt->
get_result();
while(
$row =
$result->
fetch_assoc()) {
echo
"<div class='comment'>";
echo
"<p>" .
htmlspecialchars(
$row[
'comment']) .
"</p>";
echo
"<small>Posted by " .
htmlspecialchars(
$row[
'name']) .
" on " .
$row[
'created_at'] .
"</small>";
// Fetch replies to this comment
$parent_comment_id =
$row[
'id'];
$reply_query =
"SELECT c.comment, c.created_at, u.name
FROM comments c
JOIN users u ON c.user_id = u.id
WHERE c.parent_comment_id = ?
ORDER BY c.created_at ASC";
$reply_stmt =
$conn->
prepare(
$reply_query);
$reply_stmt->
bind_param(
"i",
$parent_comment_id);
$reply_stmt->
execute();
$reply_result =
$reply_stmt->
get_result();
while(
$reply =
$reply_result->
fetch_assoc()) {
echo
"<div class='reply'>";
echo
"<p>" .
htmlspecialchars(
$reply[
'comment']) .
"</p>";
echo
"<small>Reply by " .
htmlspecialchars(
$reply[
'name']) .
" on " .
$reply[
'created_at'] .
"</small>";
echo
"</div>";
}
echo
"</div>";
}
}
?>
4. comment_count.php - Get Comment Count:
This
file will return the total number of comments for a specific blog post.
Example
Code:
<?php
include(
'db.php');
if(
isset(
$_POST[
'blog_id'])) {
$blog_id =
$_POST[
'blog_id'];
// Get the total comment count
$query =
"SELECT COUNT(*) AS comment_count FROM comments WHERE blog_id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"i",
$blog_id);
$stmt->
execute();
$result =
$stmt->
get_result()->
fetch_assoc();
echo
json_encode([
'comment_count' =>
$result[
'comment_count']]);
}
?>
Frontend Example:
For
the comment section:
<h2>Comments
</h2>
<form
action=
"post_comment.php"
method=
"POST">
<textarea
name=
"comment"
required>
</textarea>
<input
type=
"hidden"
name=
"blog_id"
value=
"1">
<!-- Blog ID -->
<button
type=
"submit">Post Comment
</button>
</form>
<div
id=
"comments-section">
<!-- Comments will be dynamically loaded here via AJAX -->
</div>
AJAX
to Fetch Comment Count:
function
loadCommentCount(
blog_id) {
$.
ajax({
url:
'comments/comment_count.php',
method:
'POST',
data: {
blog_id: blog_id },
success:
function(
response) {
const data =
JSON.
parse(response);
$(
'#comment-count').
text(data.
comment_count +
' Comments');
}
});
}
Conclusion:
This
module adds a comprehensive comment section to your blog application, enabling
users to post comments, reply to others, and interact with the content. It
includes features for viewing and deleting comments and supports a threaded
discussion system. Additionally, it shows a count of the total comments, making
the blog post more interactive.
8️⃣ Blog Application
✅
Module 5: User Authentication and
Authorization
🎯
Purpose:
Implement user authentication and authorization to manage user access, allowing
users to log in, register, and control access based on user roles.
Functionalities:
1. User
Registration:
o Allow
users to register with a username, email, and password.
o Validate
the form and ensure the email is unique.
2. User
Login:
o Provide
login functionality with username/email and password.
o Implement
session management to keep users logged in.
3. User
Logout:
o Enable
users to log out, destroying their session.
4. Role-Based
Access Control (RBAC):
o Users
can have different roles such as "admin," "author," and
"regular."
o Only
admins can access admin features, while regular users can access basic features
like commenting and viewing posts.
5. Password
Reset:
o Allow
users to request a password reset link via email.
o Implement
a secure process for resetting passwords.
6. Profile
Management:
o Users
can update their profiles (name, email, password).
Project Structure:
│── /auth/
│ ├── register.php # Handle
user registration
│ ├──
login.php # Handle
user
login
│ ├── logout.php # Handle
user logout
│ ├── profile.php # Manage
user profile
│ ├── reset_password.php # Handle
password
reset request
│ ├── update_password.php # Handle
password
update
│ ├── forgot_password.php #
Show forgot
password form
│ └── auth_functions.php # Common
functions
for authentication
Database Table:
users
table:
CREATE
TABLE users (
id
INT AUTO_INCREMENT
PRIMARY KEY,
username
VARCHAR(
50)
NOT
NULL,
email
VARCHAR(
100)
NOT
NULL
UNIQUE,
password
VARCHAR(
255)
NOT
NULL,
role ENUM(
'admin',
'author',
'regular')
DEFAULT
'regular',
created_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP,
updated_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP
ON
UPDATE
CURRENT_TIMESTAMP
);
username
: Unique username for the user.email
: Unique email for the user (used for login and password reset).password
: The hashed password.role
: The role assigned to the user (admin, author, or regular).created_at
: Timestamp when the user was created.updated_at
: Timestamp when the user was last updated.
Code Breakdown:
1. register.php - Handle User Registration:
This
file will allow users to register by submitting their username, email, and
password. The password will be hashed before storing it in the database.
Example
Code:
<?php
include(
'auth_functions.php');
if(
isset(
$_POST[
'register'])) {
$username =
$_POST[
'username'];
$email =
$_POST[
'email'];
$password =
$_POST[
'password'];
if(
registerUser(
$username,
$email,
$password)) {
header(
"Location: login.php");
exit;
}
else {
echo
"Registration failed. Please try again.";
}
}
function
registerUser(
$username,
$email,
$password) {
include(
'db.php');
// Hash the password
$hashed_password =
password_hash(
$password, PASSWORD_BCRYPT);
// Insert into the database
$query =
"INSERT INTO users (username, email, password) VALUES (?, ?, ?)";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"sss",
$username,
$email,
$hashed_password);
return
$stmt->
execute();
}
?>
2. login.php - Handle User Login:
This
file will handle the login functionality, checking the email and password, and
managing sessions for logged-in users.
Example
Code:
<?php
session_start();
include(
'auth_functions.php');
if(
isset(
$_POST[
'login'])) {
$email =
$_POST[
'email'];
$password =
$_POST[
'password'];
if(
loginUser(
$email,
$password)) {
header(
"Location: dashboard.php");
exit;
}
else {
echo
"Invalid credentials. Please try again.";
}
}
function
loginUser(
$email,
$password) {
include(
'db.php');
// Check if user exists in the database
$query =
"SELECT * FROM users WHERE email = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"s",
$email);
$stmt->
execute();
$result =
$stmt->
get_result();
if(
$result->num_rows >
0) {
$user =
$result->
fetch_assoc();
// Verify password
if(
password_verify(
$password,
$user[
'password'])) {
// Set session variables
$_SESSION[
'user_id'] =
$user[
'id'];
$_SESSION[
'role'] =
$user[
'role'];
$_SESSION[
'username'] =
$user[
'username'];
return
true;
}
}
return
false;
}
?>
3. logout.php - Handle User Logout:
This
file will log users out by destroying their session.
Example
Code:
<?php
session_start();
session_destroy();
// Destroy session
header(
"Location: login.php");
// Redirect to login page
exit;
?>
4. profile.php - Manage User Profile:
This
file will allow users to update their profile information, such as username and
email.
Example
Code:
<?php
session_start();
include(
'auth_functions.php');
if(
isset(
$_POST[
'update_profile'])) {
$username =
$_POST[
'username'];
$email =
$_POST[
'email'];
if(
updateProfile(
$_SESSION[
'user_id'],
$username,
$email)) {
echo
"Profile updated successfully!";
}
else {
echo
"Failed to update profile.";
}
}
function
updateProfile(
$user_id,
$username,
$email) {
include(
'db.php');
$query =
"UPDATE users SET username = ?, email = ? WHERE id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"ssi",
$username,
$email,
$user_id);
return
$stmt->
execute();
}
?>
5. forgot_password.php - Handle Forgot
Password Form:
This
file will display a form where users can request a password reset by entering
their email.
Example
Code:
<?php
// Show the form for email input for password reset
?>
<form action=
"reset_password.php" method=
"POST">
<input type=
"email" name=
"email" placeholder=
"Enter your email" required>
<button type=
"submit">Reset Password</button>
</form>
6. reset_password.php - Handle Password
Reset:
This
file will process the password reset request, sending an email with a reset
link or token.
Example
Code:
<?php
// Handle password reset functionality, including email verification and token generation
?>
Frontend Example:
For
login.php:
<h2>Login
</h2>
<form
action=
"login.php"
method=
"POST">
<input
type=
"email"
name=
"email"
placeholder=
"Enter your email"
required>
<input
type=
"password"
name=
"password"
placeholder=
"Enter your password"
required>
<button
type=
"submit"
name=
"login">Login
</button>
</form>
<a
href=
"forgot_password.php">Forgot Password?
</a>
For
register.php:
<h2>Register
</h2>
<form
action=
"register.php"
method=
"POST">
<input
type=
"text"
name=
"username"
placeholder=
"Enter your username"
required>
<input
type=
"email"
name=
"email"
placeholder=
"Enter your email"
required>
<input
type=
"password"
name=
"password"
placeholder=
"Enter your password"
required>
<button
type=
"submit"
name=
"register">Register
</button>
</form>
Conclusion:
This module adds comprehensive user authentication and authorization features to your blog application. It enables users to register, log in, log out, and manage their profiles securely. The password reset functionality is essential for user account recovery, and role-based access control ensures that only authorized users can access certain features. This module improves the security and user experience of your blog application.
8️⃣ Blog Application
✅
Module 6: Commenting System
🎯
Purpose:
Allow users to comment on blog posts, creating more engagement and interaction
within the blog application.
Functionalities:
1. Post
a Comment:
o Logged-in
users can post comments on blog posts.
o Ensure
that each comment is associated with a blog post and the user who posted it.
2. View
Comments:
o Display
all comments under each blog post, showing the username of the commenter and
the time the comment was posted.
3. Edit
Comment:
o Allow
users to edit their comments within a certain time frame after posting.
o Ensure
only the comment's author can edit it.
4. Delete
Comment:
o Allow
users to delete their own comments.
o Admins
can delete any comment.
5. Comment
Moderation (Admin only):
o Admins
can mark comments as spam or inappropriate.
o Admins
can approve or reject pending comments (if moderation is required).
6. Comment
Pagination:
o Paginate
comments to avoid overwhelming the page with too many comments.
Project Structure:
│── /comments/
│ ├── post_comment.php
# Handle adding new comments
│ ├── edit_comment.php
# Handle editing comments
│ ├── delete_comment.php
# Handle deleting comments
│ ├── comment_moderation.php
# Admin comment moderation
│ ├── display_comments.php
# Display comments under blog post
│ └── comment_functions.php
# Common functions for handling comments
Database Table:
comments
table:
CREATE
TABLE comments (
id
INT AUTO_INCREMENT
PRIMARY KEY,
blog_id
INT
NOT
NULL,
user_id
INT
NOT
NULL,
comment TEXT
NOT
NULL,
created_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP,
updated_at
TIMESTAMP
DEFAULT
CURRENT_TIMESTAMP
ON
UPDATE
CURRENT_TIMESTAMP,
status ENUM(
'pending',
'approved',
'rejected')
DEFAULT
'pending',
FOREIGN KEY (blog_id)
REFERENCES blogs(id)
ON
DELETE CASCADE,
FOREIGN KEY (user_id)
REFERENCES users(id)
ON
DELETE CASCADE
);
blog_id
: The ID of the blog post the comment belongs to.user_id
: The ID of the user who posted the comment.comment
: The content of the comment.created_at
: The timestamp when the comment was created.updated_at
: The timestamp when the comment was last updated.status
: The status of the comment (pending, approved, or rejected).
Code Breakdown:
1. post_comment.php - Handle Adding New
Comments:
This
file allows logged-in users to post comments on blog posts. Each comment will
be linked to the blog post and the user.
Example
Code:
<?php
session_start();
include(
'comment_functions.php');
if(
isset(
$_POST[
'submit_comment'])) {
$comment =
$_POST[
'comment'];
$blog_id =
$_POST[
'blog_id'];
$user_id =
$_SESSION[
'user_id'];
if(
postComment(
$user_id,
$blog_id,
$comment)) {
header(
"Location: view_blog.php?id=$blog_id");
exit;
}
else {
echo
"Failed to post comment. Please try again.";
}
}
function
postComment(
$user_id,
$blog_id,
$comment) {
include(
'db.php');
$query =
"INSERT INTO comments (user_id, blog_id, comment) VALUES (?, ?, ?)";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"iis",
$user_id,
$blog_id,
$comment);
return
$stmt->
execute();
}
?>
2. display_comments.php - Display Comments
for a Blog Post:
This
file retrieves and displays all comments for a particular blog post.
Example
Code:
<?php
include(
'comment_functions.php');
$blog_id =
$_GET[
'id'];
// Get the blog post ID
$comments =
getComments(
$blog_id);
foreach(
$comments
as
$comment) {
echo
"<div class='comment'>";
echo
"<strong>" .
$comment[
'username'] .
"</strong><br>";
echo
"<p>" .
$comment[
'comment'] .
"</p>";
echo
"<small>Posted on " .
$comment[
'created_at'] .
"</small><br>";
if (
$_SESSION[
'user_id'] ==
$comment[
'user_id']) {
echo
"<a href='edit_comment.php?id=" .
$comment[
'id'] .
"'>Edit</a> | ";
echo
"<a href='delete_comment.php?id=" .
$comment[
'id'] .
"'>Delete</a>";
}
echo
"</div><hr>";
}
function
getComments(
$blog_id) {
include(
'db.php');
$query =
"SELECT comments.*, users.username FROM comments
JOIN users ON comments.user_id = users.id
WHERE blog_id = ? AND status = 'approved' ORDER BY created_at DESC";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"i",
$blog_id);
$stmt->
execute();
$result =
$stmt->
get_result();
return
$result->
fetch_all(MYSQLI_ASSOC);
}
?>
3. edit_comment.php - Handle Editing
Comments:
This
file allows users to edit their comments within a time limit or according to
the moderation rules.
Example
Code:
<?php
session_start();
include(
'comment_functions.php');
$comment_id =
$_GET[
'id'];
$comment =
getCommentById(
$comment_id);
if(
$_SESSION[
'user_id'] !=
$comment[
'user_id']) {
echo
"You can only edit your own comments.";
exit;
}
if(
isset(
$_POST[
'edit_comment'])) {
$new_comment =
$_POST[
'comment'];
if(
editComment(
$comment_id,
$new_comment)) {
header(
"Location: view_blog.php?id=" .
$comment[
'blog_id']);
exit;
}
else {
echo
"Failed to edit comment. Please try again.";
}
}
function
editComment(
$comment_id,
$new_comment) {
include(
'db.php');
$query =
"UPDATE comments SET comment = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"si",
$new_comment,
$comment_id);
return
$stmt->
execute();
}
function
getCommentById(
$comment_id) {
include(
'db.php');
$query =
"SELECT * FROM comments WHERE id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"i",
$comment_id);
$stmt->
execute();
$result =
$stmt->
get_result();
return
$result->
fetch_assoc();
}
?>
4. delete_comment.php - Handle Deleting
Comments:
This
file allows users to delete their own comments. Admins can delete any comment.
Example
Code:
<?php
session_start();
include(
'comment_functions.php');
$comment_id =
$_GET[
'id'];
$comment =
getCommentById(
$comment_id);
if(
$_SESSION[
'user_id'] ==
$comment[
'user_id'] ||
$_SESSION[
'role'] ==
'admin') {
if(
deleteComment(
$comment_id)) {
header(
"Location: view_blog.php?id=" .
$comment[
'blog_id']);
exit;
}
else {
echo
"Failed to delete comment. Please try again.";
}
}
else {
echo
"You can only delete your own comments.";
}
function
deleteComment(
$comment_id) {
include(
'db.php');
$query =
"DELETE FROM comments WHERE id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"i",
$comment_id);
return
$stmt->
execute();
}
?>
5. comment_moderation.php (Admin Only) -
Handle Comment Moderation:
This
file allows admins to approve, reject, or mark comments as spam.
Example
Code:
<?php
session_start();
if(
$_SESSION[
'role'] !=
'admin') {
echo
"Access denied!";
exit;
}
include(
'comment_functions.php');
if(
isset(
$_POST[
'moderate'])) {
$comment_id =
$_POST[
'comment_id'];
$status =
$_POST[
'status'];
if(
moderateComment(
$comment_id,
$status)) {
echo
"Comment moderated successfully.";
}
else {
echo
"Failed to moderate comment.";
}
}
function
moderateComment(
$comment_id,
$status) {
include(
'db.php');
$query =
"UPDATE comments SET status = ? WHERE id = ?";
$stmt =
$conn->
prepare(
$query);
$stmt->
bind_param(
"si",
$status,
$comment_id);
return
$stmt->
execute();
}
?>
Frontend Example:
For
view_blog.php (where comments
are displayed):
<h2>Comments
</h2>
<form
action=
"post_comment.php"
method=
"POST">
<textarea
name=
"comment"
placeholder=
"Write your comment here..."
required>
</textarea>
<input
type=
"hidden"
name=
"blog_id"
value=
"<?php echo $blog_id; ?>">
<button
type=
"submit"
name=
"submit_comment">Post Comment
</button>
</form>
<div
class=
"comments">
<?php include('display_comments.php'); ?>
</div>