In this tutorial, you will learn how to create a Facebook Style Friend request system in PHP PDO with MySQL Database.
Features of this friend request system:
- Login and Sign up.
- A user can send, accept, ignore, and cancel a friend request.
- Request Notification.
- Unfriend a friend.
- Total number of friends.
Follow the below steps to create this PHP friend request system:
1. Databse Set-Up
Open your phpMyAdmin and create a new database called frnd_req_system
.
After that, you need to create three tables inside this – users
, friend_request
, and friends
.

To create these three tables you need to download this SQL file and then import this SQL file into the frnd_req_system
database.

2. Creation of PHP Friend Request app
Open your Xampp htdocs folder and inside of the htdocs folder create a new folder called frs
(this is the main app folder).
If you are curious to know what files and folders we have to create to build this Friend Request application, see the following image and folder structure tree.

frs/
├─ includes/
│ ├─ classes/
│ │ ├─ database.php
│ │ ├─ friend.php
│ │ ├─ user.php
│ ├─ init.php
├─ profile_images/
├─ friends.php
├─ functions.php
├─ index.php
├─ logout.php
├─ notifications.php
├─ profile.php
├─ signup.php
├─ style.css
├─ user_profile.php
So first, at the root of the frs
folder create a new folder called includes
, and inside the includes folder create a new folder called classes. Inside the classes folder we need to create three classes
–
- database.php
- user.php
- friend.php
2.1. database.php
database.php
is for making the database connection.
<?php
class Database
{
public function dbConnection(){
$db_host = "localhost";
$db_name = "frnd_req_system";
$db_username = "root";
$db_password = "";
$dsn_db = 'mysql:host='.$db_host.';dbname='.$db_name.';charset=utf8';
try{
$site_db = new PDO($dsn_db, $db_username, $db_password);
$site_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $site_db;
}catch (PDOException $e){
echo $e->getMessage();
exit;
}
}
}
2.2. user.php
After making the database connection, we will create the User class so that users can sign up and login and we will also fetching users from the database through this class.
<?php
class User{
protected $db;
protected $user_name;
protected $user_email;
protected $user_pass;
protected $hash_pass;
function __construct($db_connection){
$this->db = $db_connection;
}
// SING UP USER
function singUpUser($username, $email, $password){
try{
$this->user_name = trim($username);
$this->user_email = trim($email);
$this->user_pass = trim($password);
if(!empty($this->user_name) && !empty($this->user_email) && !empty($this->user_pass)){
if (filter_var($this->user_email, FILTER_VALIDATE_EMAIL)) {
$check_email = $this->db->prepare("SELECT * FROM `users` WHERE user_email = ?");
$check_email->execute([$this->user_email]);
if($check_email->rowCount() > 0){
return ['errorMessage' => 'This Email Address is already registered. Please Try another.'];
}
else{
$user_image = rand(1,12);
$this->hash_pass = password_hash($this->user_pass, PASSWORD_DEFAULT);
$sql = "INSERT INTO `users` (username, user_email, user_password, user_image) VALUES(:username, :user_email, :user_pass, :user_image)";
$sign_up_stmt = $this->db->prepare($sql);
//BIND VALUES
$sign_up_stmt->bindValue(':username',htmlspecialchars($this->user_name), PDO::PARAM_STR);
$sign_up_stmt->bindValue(':user_email',$this->user_email, PDO::PARAM_STR);
$sign_up_stmt->bindValue(':user_pass',$this->hash_pass, PDO::PARAM_STR);
// INSERTING RANDOM IMAGE NAME
$sign_up_stmt->bindValue(':user_image',$user_image.'.png', PDO::PARAM_STR);
$sign_up_stmt->execute();
return ['successMessage' => 'You have signed up successfully.'];
}
}
else{
return ['errorMessage' => 'Invalid email address!'];
}
}
else{
return ['errorMessage' => 'Please fill in all the required fields.'];
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// LOGIN USER
function loginUser($email, $password){
try{
$this->user_email = trim($email);
$this->user_pass = trim($password);
$find_email = $this->db->prepare("SELECT * FROM `users` WHERE user_email = ?");
$find_email->execute([$this->user_email]);
if($find_email->rowCount() === 1){
$row = $find_email->fetch(PDO::FETCH_ASSOC);
$match_pass = password_verify($this->user_pass, $row['user_password']);
if($match_pass){
$_SESSION = [
'user_id' => $row['id'],
'email' => $row['user_email']
];
header('Location: profile.php');
}
else{
return ['errorMessage' => 'Invalid password'];
}
}
else{
return ['errorMessage' => 'Invalid email address!'];
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// FIND USER BY ID
function find_user_by_id($id){
try{
$find_user = $this->db->prepare("SELECT * FROM `users` WHERE id = ?");
$find_user->execute([$id]);
if($find_user->rowCount() === 1){
return $find_user->fetch(PDO::FETCH_OBJ);
}
else{
return false;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// FETCH ALL USERS WHERE ID IS NOT EQUAL TO MY ID
function all_users($id){
try{
$get_users = $this->db->prepare("SELECT id, username, user_image FROM `users` WHERE id != ?");
$get_users->execute([$id]);
if($get_users->rowCount() > 0){
return $get_users->fetchAll(PDO::FETCH_OBJ);
}
else{
return false;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
}
2.3. friend.php
The friend.php
will handle the friend request actions and it’ll also handle the notification of the requests.
<?php
class Friend{
protected $db;
public function __construct($db_connection){
$this->db = $db_connection;
}
// CHECK IF ALREADY FRIENDS
public function is_already_friends($my_id, $user_id){
try{
$sql = "SELECT * FROM `friends` WHERE (user_one = :my_id AND user_two = :frnd_id) OR (user_one = :frnd_id AND user_two = :my_id)";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':my_id',$my_id, PDO::PARAM_INT);
$stmt->bindValue(':frnd_id', $user_id, PDO::PARAM_INT);
$stmt->execute();
if($stmt->rowCount() === 1){
return true;
}
else{
return false;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// IF I AM THE REQUEST SENDER
public function am_i_the_req_sender($my_id, $user_id){
try{
$sql = "SELECT * FROM `friend_request` WHERE sender = ? AND receiver = ?";
$stmt = $this->db->prepare($sql);
$stmt->execute([$my_id, $user_id]);
if($stmt->rowCount() === 1){
return true;
}
else{
return false;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// IF I AM THE RECEIVER
public function am_i_the_req_receiver($my_id, $user_id){
try{
$sql = "SELECT * FROM `friend_request` WHERE sender = ? AND receiver = ?";
$stmt = $this->db->prepare($sql);
$stmt->execute([$user_id, $my_id]);
if($stmt->rowCount() === 1){
return true;
}
else{
return false;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// CHECK IF REQUEST HAS ALREADY BEEN SENT
public function is_request_already_sent($my_id, $user_id){
try{
$sql = "SELECT * FROM `friend_request` WHERE (sender = :my_id AND receiver = :frnd_id) OR (sender = :frnd_id AND receiver = :my_id)";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':my_id',$my_id, PDO::PARAM_INT);
$stmt->bindValue(':frnd_id', $user_id, PDO::PARAM_INT);
$stmt->execute();
if($stmt->rowCount() === 1){
return true;
}
else{
return false;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// MAKE PENDING FRIENDS (SEND FRIEND REQUEST)
public function make_pending_friends($my_id, $user_id){
try{
$sql = "INSERT INTO `friend_request`(sender, receiver) VALUES(?,?)";
$stmt = $this->db->prepare($sql);
$stmt->execute([$my_id, $user_id]);
header('Location: user_profile.php?id='.$user_id);
exit;
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// CANCEL FRIEND REQUEST
public function cancel_or_ignore_friend_request($my_id, $user_id){
try{
$sql = "DELETE FROM `friend_request` WHERE (sender = :my_id AND receiver = :frnd_id) OR (sender = :frnd_id AND receiver = :my_id)";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':my_id',$my_id, PDO::PARAM_INT);
$stmt->bindValue(':frnd_id', $user_id, PDO::PARAM_INT);
$stmt->execute();
header('Location: user_profile.php?id='.$user_id);
exit;
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// MAKE FRIENDS
public function make_friends($my_id, $user_id){
try{
$delete_pending_friends = "DELETE FROM `friend_request` WHERE (sender = :my_id AND receiver = :frnd_id) OR (sender = :frnd_id AND receiver = :my_id)";
$delete_stmt = $this->db->prepare($delete_pending_friends);
$delete_stmt->bindValue(':my_id',$my_id, PDO::PARAM_INT);
$delete_stmt->bindValue(':frnd_id', $user_id, PDO::PARAM_INT);
$delete_stmt->execute();
if($delete_stmt->execute()){
$sql = "INSERT INTO `friends`(user_one, user_two) VALUES(?, ?)";
$stmt = $this->db->prepare($sql);
$stmt->execute([$my_id, $user_id]);
header('Location: user_profile.php?id='.$user_id);
exit;
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// DELETE FRIENDS
public function delete_friends($my_id, $user_id){
try{
$delete_friends = "DELETE FROM `friends` WHERE (user_one = :my_id AND user_two = :frnd_id) OR (user_one = :frnd_id AND user_two = :my_id)";
$delete_stmt = $this->db->prepare($delete_friends);
$delete_stmt->bindValue(':my_id',$my_id, PDO::PARAM_INT);
$delete_stmt->bindValue(':frnd_id', $user_id, PDO::PARAM_INT);
$delete_stmt->execute();
header('Location: user_profile.php?id='.$user_id);
exit;
}
catch (PDOException $e) {
die($e->getMessage());
}
}
// REQUEST NOTIFICATIONS
public function request_notification($my_id, $send_data){
try{
$sql = "SELECT sender, username, user_image FROM `friend_request` JOIN users ON friend_request.sender = users.id WHERE receiver = ?";
$stmt = $this->db->prepare($sql);
$stmt->execute([$my_id]);
if($send_data){
return $stmt->fetchAll(PDO::FETCH_OBJ);
}
else{
return $stmt->rowCount();
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
public function get_all_friends($my_id, $send_data){
try{
$sql = "SELECT * FROM `friends` WHERE user_one = :my_id OR user_two = :my_id";
$stmt = $this->db->prepare($sql);
$stmt->bindValue(':my_id',$my_id, PDO::PARAM_INT);
$stmt->execute();
if($send_data){
$return_data = [];
$all_users = $stmt->fetchAll(PDO::FETCH_OBJ);
foreach($all_users as $row){
if($row->user_one == $my_id){
$get_user = "SELECT id, username, user_image FROM `users` WHERE id = ?";
$get_user_stmt = $this->db->prepare($get_user);
$get_user_stmt->execute([$row->user_two]);
array_push($return_data, $get_user_stmt->fetch(PDO::FETCH_OBJ));
}else{
$get_user = "SELECT id, username, user_image FROM `users` WHERE id = ?";
$get_user_stmt = $this->db->prepare($get_user);
$get_user_stmt->execute([$row->user_one]);
array_push($return_data, $get_user_stmt->fetch(PDO::FETCH_OBJ));
}
}
return $return_data;
}
else{
return $stmt->rowCount();
}
}
catch (PDOException $e) {
die($e->getMessage());
}
}
}
2.4. init.php
After creating all the classes, now inside the includes
folder create the init.php
file. In this file, we will initialize all the classes.
<?php
session_start();
session_regenerate_id(true);
require 'classes/database.php';
require 'classes/user.php';
require 'classes/friend.php';
// DATABASE CONNECTIONS
$db_obj = new Database();
$db_connection = $db_obj->dbConnection();
// USER OBJECT
$user_obj = new User($db_connection);
// FRIEND OBJECT
$frnd_obj = new Friend($db_connection);
2.5. index.php
Users can login through this index.php
.
<?php
require 'includes/init.php';
// IF USER MAKING LOGIN REQUEST
if(isset($_POST['email']) && isset($_POST['password'])){
$result = $user_obj->loginUser($_POST['email'],$_POST['password']);
}
// IF USER ALREADY LOGGED IN
if(isset($_SESSION['email'])){
header('Location: profile.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Login</title>
<link rel="stylesheet" href="./style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">
</head>
<body>
<div class="main_container login_signup_container">
<h1>Login</h1>
<form action="" method="POST">
<label for="email">Email</label>
<input type="email" id="email" name="email" spellcheck="false" placeholder="Enter your email address" required>
<label for="password">Password</label>
<input type="password" id="password" name="password" placeholder="Enter your password" required>
<input type="submit" value="Login">
<a href="signup.php" class="form_link">Sign Up</a>
<div>
<?php
if(isset($result['errorMessage'])){
echo '<p class="errorMsg">'.$result['errorMessage'].'</p>';
}
if(isset($result['successMessage'])){
echo '<p class="successMsg">'.$result['successMessage'].'</p>';
}
?>
</div>
</form>
<p><a href="https://www.webtutorials.me">Webtutorials.ME</a></p>
</div>
</body>
</html>
2.6. signup.php
Users can Sign Up through this signup.php.
<?php
require 'includes/init.php';
// IF USER MAKING SIGNUP REQUEST
if(isset($_POST['username']) && isset($_POST['email']) && isset($_POST['password'])){
$result = $user_obj->singUpUser($_POST['username'],$_POST['email'],$_POST['password']);
}
// IF USER ALREADY LOGGED IN
if(isset($_SESSION['email'])){
header('Location: profile.php');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Login</title>
<link rel="stylesheet" href="./style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">
</head>
<body>
<div class="main_container login_signup_container">
<h1>Sign Up</h1>
<form action="" method="POST" novalidate>
<label for="username">Full Name</label>
<input type="text" id="username" name="username" spellcheck="false" placeholder="Enter your full name" required>
<label for="email">Email</label>
<input type="email" id="email" name="email" spellcheck="false" placeholder="Enter your email address" required>
<label for="password">Password</label>
<input type="password" id="password" name="password" placeholder="Enter your password" required>
<input type="submit" value="Sign Up">
<a href="index.php" class="form_link">Login</a>
</form>
<div>
<?php
if(isset($result['errorMessage'])){
echo '<p class="errorMsg">'.$result['errorMessage'].'</p>';
}
if(isset($result['successMessage'])){
echo '<p class="successMsg">'.$result['successMessage'].'</p>';
}
?>
</div>
<p><a href="https://www.webtutorials.me">Webtutorials.ME</a></p>
</div>
</body>
</html>
2.7. profile.php
Users can access this profile.php after logging in.
<?php
require 'includes/init.php';
if(isset($_SESSION['user_id']) && isset($_SESSION['email'])){
$user_data = $user_obj->find_user_by_id($_SESSION['user_id']);
if($user_data === false){
header('Location: logout.php');
exit;
}
// FETCH ALL USERS WHERE ID IS NOT EQUAL TO MY ID
$all_users = $user_obj->all_users($_SESSION['user_id']);
}
else{
header('Location: logout.php');
exit;
}
// REQUEST NOTIFICATION NUMBER
$get_req_num = $frnd_obj->request_notification($_SESSION['user_id'], false);
// TOTAL FRIENDS
$get_frnd_num = $frnd_obj->get_all_friends($_SESSION['user_id'], false);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?php echo $user_data->username;?></title>
<link rel="stylesheet" href="./style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">
</head>
<body>
<div class="profile_container">
<div class="inner_profile">
<div class="img">
<img src="profile_images/<?php echo $user_data->user_image; ?>" alt="Profile image">
</div>
<h1><?php echo $user_data->username;?></h1>
</div>
<nav>
<ul>
<li><a href="profile.php" rel="noopener noreferrer" class="active">Home</a></li>
<li><a href="notifications.php" rel="noopener noreferrer">Requests<span class="badge <?php
if($get_req_num > 0){
echo 'redBadge';
}
?>"><?php echo $get_req_num;?></span></a></li>
<li><a href="friends.php" rel="noopener noreferrer">Friends<span class="badge"><?php echo $get_frnd_num;?></span></a></li>
<li><a href="logout.php" rel="noopener noreferrer">Logout</a></li>
</ul>
</nav>
<div class="all_users">
<h3>All Users</h3>
<div class="usersWrapper">
<?php
if($all_users){
foreach($all_users as $row){
echo '<div class="user_box">
<div class="user_img"><img src="profile_images/'.$row->user_image.'" alt="Profile image"></div>
<div class="user_info"><span>'.$row->username.'</span>
<span><a href="user_profile.php?id='.$row->id.'" class="see_profileBtn">See profile</a></div>
</div>';
}
}
else{
echo '<h4>There is no user!</h4>';
}
?>
</div>
</div>
<p class="site_link"><a href="https://www.webtutorials.me">Webtutorials.ME</a></p>
</div>
</body>
</html>
2.8. user_profile.php
Through this user_profile.php user can see other users profile.
<?php
require 'includes/init.php';
if(isset($_SESSION['user_id']) && isset($_SESSION['email'])){
if(isset($_GET['id'])){
$user_data = $user_obj->find_user_by_id($_GET['id']);
if($user_data === false){
header('Location: profile.php');
exit;
}
else{
if($user_data->id == $_SESSION['user_id']){
header('Location: profile.php');
exit;
}
}
}
}
else{
header('Location: logout.php');
exit;
}
// CHECK FRIENDS
$is_already_friends = $frnd_obj->is_already_friends($_SESSION['user_id'], $user_data->id);
// IF I AM THE REQUEST SENDER
$check_req_sender = $frnd_obj->am_i_the_req_sender($_SESSION['user_id'], $user_data->id);
// IF I AM THE REQUEST RECEIVER
$check_req_receiver = $frnd_obj->am_i_the_req_receiver($_SESSION['user_id'], $user_data->id);
// TOTAL REQUESTS
$get_req_num = $frnd_obj->request_notification($_SESSION['user_id'], false);
// TOTAL FRIENDS
$get_frnd_num = $frnd_obj->get_all_friends($_SESSION['user_id'], false);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?php echo $user_data->username;?></title>
<link rel="stylesheet" href="./style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">
</head>
<body>
<div class="profile_container">
<div class="inner_profile">
<div class="img">
<img src="profile_images/<?php echo $user_data->user_image; ?>" alt="Profile image">
</div>
<h1><?php echo $user_data->username;?></h1>
<nav>
<ul>
<li><a href="profile.php" rel="noopener noreferrer">Home</a></li>
<li><a href="notifications.php" rel="noopener noreferrer">Requests<span class="badge <?php
if($get_req_num > 0){
echo 'redBadge';
}
?>"><?php echo $get_req_num;?></span></a></li>
<li><a href="friends.php" rel="noopener noreferrer">Friends<span class="badge"><?php echo $get_frnd_num;?></span></a></li>
<li><a href="logout.php" rel="noopener noreferrer">Logout</a></li>
</ul>
</nav>
<div class="actions">
<?php
if($is_already_friends){
echo '<a href="functions.php?action=unfriend_req&id='.$user_data->id.'" class="req_actionBtn unfriend">Unfriend</a>';
}
elseif($check_req_sender){
echo '<a href="functions.php?action=cancel_req&id='.$user_data->id.'" class="req_actionBtn cancleRequest">Cancel Request</a>';
}
elseif($check_req_receiver){
echo '<a href="functions.php?action=ignore_req&id='.$user_data->id.'" class="req_actionBtn ignoreRequest">Ignore</a>
<a href="functions.php?action=accept_req&id='.$user_data->id.'" class="req_actionBtn acceptRequest">Accept</a>';
}
else{
echo '<a href="functions.php?action=send_req&id='.$user_data->id.'" class="req_actionBtn sendRequest">Send Request</a>';
}
?>
</div>
</div>
<p class="site_link"><a href="https://www.webtutorials.me">Webtutorials.ME</a></p>
</div>
</body>
</html>
2.9. notifications.php
In the notifications.php, the logged in user can see which people have sent him a friend request.
<?php
require 'includes/init.php';
if(isset($_SESSION['user_id']) && isset($_SESSION['email'])){
$user_data = $user_obj->find_user_by_id($_SESSION['user_id']);
if($user_data === false){
header('Location: logout.php');
exit;
}
}
else{
header('Location: logout.php');
exit;
}
// TOTAL REQUESTS
$get_req_num = $frnd_obj->request_notification($_SESSION['user_id'], false);
// TOTAL FRIENDS
$get_frnd_num = $frnd_obj->get_all_friends($_SESSION['user_id'], false);
$get_all_req_sender = $frnd_obj->request_notification($_SESSION['user_id'], true);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?php echo $user_data->username;?></title>
<link rel="stylesheet" href="./style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">
</head>
<body>
<div class="profile_container">
<div class="inner_profile">
<div class="img">
<img src="profile_images/<?php echo $user_data->user_image; ?>" alt="Profile image">
</div>
<h1><?php echo $user_data->username;?></h1>
</div>
<nav>
<ul>
<li><a href="profile.php" rel="noopener noreferrer">Home</a></li>
<li><a href="notifications.php" rel="noopener noreferrer" class="active">Requests<span class="badge <?php
if($get_req_num > 0){
echo 'redBadge';
}
?>"><?php echo $get_req_num;?></span></a></li>
<li><a href="friends.php" rel="noopener noreferrer">Friends<span class="badge"><?php echo $get_frnd_num;?></span></a></li>
<li><a href="logout.php" rel="noopener noreferrer">Logout</a></li>
</ul>
</nav>
<div class="all_users">
<h3>All request senders</h3>
<div class="usersWrapper">
<?php
if($get_req_num > 0){
foreach($get_all_req_sender as $row){
echo '<div class="user_box">
<div class="user_img"><img src="profile_images/'.$row->user_image.'" alt="Profile image"></div>
<div class="user_info"><span>'.$row->username.'</span>
<span><a href="user_profile.php?id='.$row->sender.'" class="see_profileBtn">See profile</a></div>
</div>';
}
}
else{
echo '<h4>You have no friend requests!</h4>';
}
?>
</div>
</div>
<p class="site_link"><a href="https://www.webtutorials.me">Webtutorials.ME</a></p>
</div>
</body>
</html>
2.10. friends.php
The user can see all his friends list in the friends.php
.
<?php
require 'includes/init.php';
if(isset($_SESSION['user_id']) && isset($_SESSION['email'])){
$user_data = $user_obj->find_user_by_id($_SESSION['user_id']);
if($user_data === false){
header('Location: logout.php');
exit;
}
}
else{
header('Location: logout.php');
exit;
}
// TOTAL REQUESTS
$get_req_num = $frnd_obj->request_notification($_SESSION['user_id'], false);
// TOTLA FRIENDS
$get_frnd_num = $frnd_obj->get_all_friends($_SESSION['user_id'], false);
// GET MY($_SESSION['user_id']) ALL FRIENDS
$get_all_friends = $frnd_obj->get_all_friends($_SESSION['user_id'], true);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><?php echo $user_data->username;?></title>
<link rel="stylesheet" href="./style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">
</head>
<body>
<div class="profile_container">
<div class="inner_profile">
<div class="img">
<img src="profile_images/<?php echo $user_data->user_image; ?>" alt="Profile image">
</div>
<h1><?php echo $user_data->username;?></h1>
</div>
<nav>
<ul>
<li><a href="profile.php" rel="noopener noreferrer">Home</a></li>
<li><a href="notifications.php" rel="noopener noreferrer">Requests<span class="badge <?php
if($get_req_num > 0){
echo 'redBadge';
}
?>"><?php echo $get_req_num;?></span></a></li>
<li><a href="friends.php" rel="noopener noreferrer" class="active">Friends<span class="badge"><?php echo $get_frnd_num;?></span></a></li>
<li><a href="logout.php" rel="noopener noreferrer">Logout</a></li>
</ul>
</nav>
<div class="all_users">
<h3>All friends</h3>
<div class="usersWrapper">
<?php
if($get_frnd_num > 0){
foreach($get_all_friends as $row){
echo '<div class="user_box">
<div class="user_img"><img src="profile_images/'.$row->user_image.'" alt="Profile image"></div>
<div class="user_info"><span>'.$row->username.'</span>
<span><a href="user_profile.php?id='.$row->id.'" class="see_profileBtn">See profile</a></div>
</div>';
}
}
else{
echo '<h4>You have no friends!</h4>';
}
?>
</div>
</div>
<p class="site_link"><a href="https://www.webtutorials.me">Webtutorials.ME</a></p>
</div>
</body>
</html>
2.11. functions.php
The functions.php
perform all the request actions such as sending a friend request, accept or ignore the request, etc.
<?php
require 'includes/init.php';
// PROFILE REDIRECT FUNCTION
function redirect_to_profile(){
header('Location: profile.php');
exit;
}
// IF GET ACTION AND ID PARAMETERS
if(isset($_GET['action']) && isset($_GET['id'])){
// CHEKC USER LOGGED IN OR NOT || IF USER LOGGED IN
if(isset($_SESSION['user_id']) && isset($_SESSION['email'])){
// IF PARAMETER ID IS EQUAL TO MY ID($_SESSION['user_id']) THEN REDIRECT TO PROFILE
if($_GET['id'] == $_SESSION['user_id']){
redirect_to_profile();
}
// OTHERWISE DO THIS
else{
// ASSIGN TO VARIABLE
$user_id = $_GET['id'];
$my_id = $_SESSION['user_id'];
// IF GET SEND REQUEST ACTION
if($_GET['action'] == 'send_req'){
// CHECK IS REQUEST ALREADY SENT OR NOT
// is_request_already_sent() FUNCTION RETURN TRUE OR FLASE
if($frnd_obj->is_request_already_sent($my_id, $user_id)){
redirect_to_profile();
}
// CHECK IF THIS ID IS ALREADY IN MY FRIENDS LIST.
// THIS FUNCTION ALSO RETURN TRUE OR FLASE
elseif($frnd_obj->is_already_friends($my_id, $user_id)){
redirect_to_profile();
}
// OTHERWISE MAKE FRIEND REQUEST
else{
$frnd_obj->make_pending_friends($my_id, $user_id);
}
}
// IF GET CANCEL REQUEST OR IGNORE REQUEST ACTION
else if($_GET['action'] == 'cancel_req' || $_GET['action'] == 'ignore_req'){
$frnd_obj->cancel_or_ignore_friend_request($my_id, $user_id);
}
// IF GET ACCEPT REQUEST ACTION
elseif($_GET['action'] == 'accept_req'){
if($frnd_obj->is_already_friends($my_id, $user_id)){
redirect_to_profile();
}
else{
$frnd_obj->make_friends($my_id, $user_id);
}
}
// IF GET UNFRIEND REQUEST ACTION
elseif($_GET['action'] == 'unfriend_req'){
$frnd_obj->delete_friends($my_id, $user_id);
}
else{
redirect_to_profile();
}
}
}
else{
header('Location: logout.php');
exit;
}
}
else{
redirect_to_profile();
}
2.12. logout.php
<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finally, destroy the session.
session_destroy();
header("Location: index.php");
exit;
2.13. style.css
*{
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
body{
padding: 20px;
margin: 0;
font-family: 'Open Sans', sans-serif;
background-color: #FFF;
}
a{
color: inherit;
text-decoration: none;
outline: none;
}
h1{
text-align: center;
color: #232323;
}
.main_container{
max-width: 450px;
margin: 0 auto;
background-color: #F8FAFC;
padding: 20px;
border: 1px solid rgba(23,23,23, .1);
border-radius: 3px;
}
.login_signup_container input[type='text'],
.login_signup_container input[type='email'],
.login_signup_container input[type='password']{
width: 100%;
padding: 10px;
border: 0;
border-bottom: 1px solid #8795A1;
outline: none;
margin-bottom: 10px;
font-size: 14px;
background: none;
color: #232323;
font-family: 'Open Sans', sans-serif;
}
.login_signup_container input[type='text']:focus,
.login_signup_container input[type='email']:focus,
.login_signup_container input[type='password']:focus{
border-color: #606F7B;
}
.login_signup_container label{
font-weight: bold;
color: #232323;
}
.login_signup_container input[type='submit']{
color: #ffffff;
padding: 10px 20px;
font-size: 14px;
text-transform: uppercase;
cursor: pointer;
border: 1px solid rgba(23,23,23, .1);
outline: none;
background-color: #1F9D55;
}
.form_link{
float: right;
font-size: 16px;
}
.site_link,.login_signup_container p{
font-size: 14px;
text-align: center;
color: #3D4852;
text-transform: uppercase;
letter-spacing: 3px;
}
.site_link:hover,.form_link:hover,.login_signup_container p a:hover{
text-decoration: underline;
color: #1F9D55;
}
.login_signup_container .errorMsg{
border: 2px solid #CC1F1A;
color: #CC1F1A;
letter-spacing: normal;
font-size: 16px;
padding: 10px;
}
.login_signup_container .successMsg{
border: 2px solid #1F9D55;
color: #1F9D55;
letter-spacing: normal;
font-size: 16px;
padding: 10px;
}
/* PROFILE.PHP */
.profile_container{
margin: 0 auto;
max-width: 600px;
background-color: #F8FAFC;
border: 1px solid rgba(23,23,23, .1);
padding: 10px;
}
.profile_container nav ul{
list-style: none;
padding: 5px 0;
margin:10px 0;
display: flex;
flex-wrap: wrap;
border-top: 1px solid rgba(23,23,23, .2);
border-bottom: 1px solid rgba(23,23,23, .2);
justify-content: center;
background: #382B5F;
border-radius: 2px;
}
.profile_container nav ul li a{
color: #FFF;
font-size: 14px;
display: block;
padding:5px 10px;
margin:0 3px;
}
.profile_container nav ul li a:hover{
background-color: #F3EBFF;
color: #000000;
}
.profile_container nav .badge{
background: #FFF;
display: inline-block;
padding:0 5px;
margin-left: 3px;
color: #000;
border-radius: 20px;
}
.profile_container nav .redBadge{
background-color: #E3342F;
color: #FFF;
}
.inner_profile .img{
overflow: hidden;
width: 100px;
height: 100px;
border-radius: 50%;
background: #FFF;
box-shadow: 0 4px 8px 0 rgba(0,0,0,0.12),
0 2px 4px 0 rgba(0,0,0,0.08);
border: 3px solid #3D4852;
margin: 0 auto;
}
.inner_profile .img img{
max-height: 100%;
width: auto;
}
.inner_profile h1{
padding: 0;
margin: 0;
font-size: 25px;
text-transform: capitalize;
}
.active{
outline: none;
background-color: #1F9D55 !important;
color: #FFF !important;
}
/* ALL USERS */
.all_users .usersWrapper{
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.all_users .user_box{
display: flex;
flex-wrap: wrap;
align-items: center;
border: 1px solid rgba(23,23,23, .2);
margin: 5px;
padding: 5px;
width: 48%;
background-color: #FFF;
align-items: stretch;
}
.user_box .user_img{
width: 50px;
height: 50px;
overflow: hidden;
border: 1px solid rgba(23,23,23, .1);
margin-right: 5px;
border-radius: 2px;
background-color: #E6E8FF;
}
.user_box .user_img img{
height: 100%;
width: auto;
}
.user_box .user_info{
flex-grow: 1;
}
.user_info span{
display: block;
}
.user_info span:first-child{
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
text-transform: capitalize;
color: #222222;
font-weight: bold;
padding-bottom: 5px;
}
.see_profileBtn{
background-color: #794ACF;
border: 1px solid rgba(23,23,23, .1);
color: #FFF;
font-size: 12px;
padding:3px 7px;
text-transform: uppercase;
}
.see_profileBtn:hover{
background-color: #382B5F;
}
.actions{
text-align: center;
margin: 10px 0;
border: 1px solid rgba(23,23,23, .1);
padding: 10px;
background-color: #FFF;
}
.req_actionBtn{
font-size: 14px;
text-transform: uppercase;
padding:5px 10px;
border: 1px solid rgba(23,23,23, .1);
color: #222222;
}
.acceptRequest,.sendRequest{
background-color: #794ACF;
color: #FFF;
}
.acceptRequest:hover,.sendRequest:hover{
background-color: #382B5F;
}
.unfriend, .ignoreRequest,.cancleRequest{
background-color: #EF5753;
color: #FFF;
}
.unfriend:hover,.ignoreRequest:hover,.cancleRequest:hover{
background-color: #E3342F;
}
/* RESPONSIVE */
@media only screen and (max-width: 560px) {
.all_users .user_box{
width: 100%;
}
}
2.14. profile_images
Click here to download the profile images.
wow! what a beautiful coding
Thanks hafezmahmud
Thank you so much your code helped me a lot the logic is very clear and the code is very beautiful and understandable.
Is it possible to notify a user when their request is accepted?
if you know how can you tell how to go about it just the logic or more please.
Thanks
Hi, Thabo
Yes, it is possible.
To do that create a new table inside the database called req_notification.
1 – when request receiver accepts the request, that time run this query –
2 – Run this query to fetch request notifications –
Now count the number of rows and show the number into Notification section.
3 – So, what is the `seen_status`? Through the seen_status we handle that, the user has seen the notification or not.
when the user see the notification, that time run this query –
Maybe it goes wrong. I have not tested this.
seriously i like the code
Thank you so much @Chandan Tudu
it works.
Hi , I keep receiving this message saying after testing the code:
Warning: require(includes/init.php): failed to open stream: No such file or directory in /Applications/XAMPP/xamppfiles/htdocs/frs/Includes/index.php on line 3
Fatal error: require(): Failed opening required ‘includes/init.php’ (include_path=’.:/Applications/XAMPP/xamppfiles/lib/php’) in /Applications/XAMPP/xamppfiles/htdocs/frs/Includes/index.php on line 3
is there a way to fix this?
Hey Raeon,
First, make sure that inside the includes folder you have the init.php or not.
————————————
If not please create the init.php file inside the includes folder
——————————–
If yes
open the index.php file and –
change this
require ‘includes/init.php’;
to this
require ‘./includes/init.php’;
or this
require dirname(__FILE__).’/includes/init.php’;
Beautiful code! Your background music to the demo video is dope. Thanks a lot for this code.
???? Glad to help you
I have always been on Google,searching for this code until I found your site,God bless you for helping upcoming programmers!