May 10, 2026 3 min read

Complete PHP School Management System Tutorial 2026 — Build a Professional School System with PHP PDO and MySQL

Learn how to build a complete PHP School Management System using PHP PDO, MySQL and Bootstrap 5. Manage students, teachers, classes, subjects, exams, marks, reports and authentication securely.

Why Build a PHP School Management System?

A School Management System helps schools manage:

student registration
teachers
classes
subjects
examinations
marks
attendance
reports
fees
user accounts

This type of system is used in:

primary schools
secondary schools
colleges
training centers
universities

For more PHP tutorials:
https://faulink.com

Technologies Used

This project uses:

PHP PDO
MySQL
Bootstrap 5
HTML5
CSS3
JavaScript
STEP 1 — Create Database
CREATE DATABASE school_management_system;

USE school_management_system;
STEP 2 — Create Students Table
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(150) NOT NULL,
gender ENUM('Male','Female') NOT NULL,
date_of_birth DATE,
phone_number VARCHAR(30),
address VARCHAR(255),
class_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
STEP 3 — Create Teachers Table
CREATE TABLE teachers (
id INT AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(150) NOT NULL,
gender ENUM('Male','Female') NOT NULL,
phone VARCHAR(30),
email VARCHAR(150),
subject_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
STEP 4 — Create Classes Table
CREATE TABLE classes (
id INT AUTO_INCREMENT PRIMARY KEY,
class_name VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
STEP 5 — Create Subjects Table
CREATE TABLE subjects (
id INT AUTO_INCREMENT PRIMARY KEY,
subject_name VARCHAR(150) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
STEP 6 — Create Exams Table
CREATE TABLE exams (
id INT AUTO_INCREMENT PRIMARY KEY,
exam_name VARCHAR(100) NOT NULL,
exam_date DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
STEP 7 — Create Marks Table
CREATE TABLE marks (
id INT AUTO_INCREMENT PRIMARY KEY,

student_id INT NOT NULL,

subject_id INT NOT NULL,

exam_id INT NOT NULL,

marks DECIMAL(5,2) DEFAULT 0,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

FOREIGN KEY (student_id)
REFERENCES students(id)
ON DELETE CASCADE,

FOREIGN KEY (subject_id)
REFERENCES subjects(id)
ON DELETE CASCADE,

FOREIGN KEY (exam_id)
REFERENCES exams(id)
ON DELETE CASCADE
);
STEP 8 — Database Connection

config.php

<?php

if (session_status() === PHP_SESSION_NONE) {
session_start();
}

$host = "localhost";
$dbname = "school_management_system";
$user = "root";
$pass = "";

try {

$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user,
$pass,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);

} catch (PDOException $e) {

die("Database Connection Failed");

}

function clean($data) {

return htmlspecialchars(
trim($data),
ENT_QUOTES,
'UTF-8'
);
}
?>
STEP 9 — Add Student
<?php

if (isset($_POST['save_student'])) {

$student_name = clean($_POST['student_name']);
$gender = clean($_POST['gender']);
$phone_number = clean($_POST['phone_number']);
$address = clean($_POST['address']);
$class_id = (int)$_POST['class_id'];

$stmt = $pdo->prepare("
INSERT INTO students
(student_name, gender, phone_number, address, class_id)
VALUES (?, ?, ?, ?, ?)
");

$stmt->execute([
$student_name,
$gender,
$phone_number,
$address,
$class_id
]);

echo "Student added successfully.";
}
?>
STEP 10 — Add Marks
<?php

if (isset($_POST['save_marks'])) {

$student_id = (int)$_POST['student_id'];
$subject_id = (int)$_POST['subject_id'];
$exam_id = (int)$_POST['exam_id'];
$marks = (float)$_POST['marks'];

$stmt = $pdo->prepare("
INSERT INTO marks
(student_id, subject_id, exam_id, marks)
VALUES (?, ?, ?, ?)
");

$stmt->execute([
$student_id,
$subject_id,
$exam_id,
$marks
]);

echo "Marks saved successfully.";
}
?>
STEP 11 — Student Results Report
<?php

$stmt = $pdo->prepare("

SELECT
students.student_name,
subjects.subject_name,
exams.exam_name,
marks.marks

FROM marks

INNER JOIN students
ON students.id = marks.student_id

INNER JOIN subjects
ON subjects.id = marks.subject_id

INNER JOIN exams
ON exams.id = marks.exam_id

ORDER BY students.student_name ASC

");

$stmt->execute();

$results = $stmt->fetchAll();

?>
STEP 12 — Display Results Table
<table border="1" cellpadding="8">

<tr>
<th>Student</th>
<th>Subject</th>
<th>Exam</th>
<th>Marks</th>
</tr>

<?php foreach ($results as $row): ?>

<tr>
<td><?= clean($row['student_name']); ?></td>
<td><?= clean($row['subject_name']); ?></td>
<td><?= clean($row['exam_name']); ?></td>
<td><?= clean($row['marks']); ?></td>
</tr>

<?php endforeach; ?>

</table>
STEP 13 — Login System
<?php

$stmt = $pdo->prepare("
SELECT *
FROM users
WHERE username = ?
LIMIT 1
");

$stmt->execute([$username]);

$user = $stmt->fetch();

if (
$user &&
password_verify($password, $user['password'])
) {

session_regenerate_id(true);

$_SESSION['user_id'] = $user['id'];

$_SESSION['username'] = $user['username'];

header("Location: dashboard.php");

exit;
}
?>
STEP 14 — Bootstrap Dashboard
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot; rel="stylesheet">

<div class="container py-4">

<div class="row g-4">

<div class="col-md-3">
<div class="card shadow-sm border-0 rounded-4 p-3">
<small>Total Students</small>
<h3>1200</h3>
</div>
</div>

<div class="col-md-3">
<div class="card shadow-sm border-0 rounded-4 p-3">
<small>Total Teachers</small>
<h3>80</h3>
</div>
</div>

</div>

</div>
STEP 15 — Security Best Practices

Use:

PDO prepared statements
password hashing
CSRF protection
session regeneration
secure login system
input validation

Example:

$password = password_hash(
$password,
PASSWORD_DEFAULT
);
Features of PHP School Management System
student registration
teacher management
class management
subjects management
examinations
marks management
reports
secure login
Bootstrap dashboard
responsive design
Benefits of School Management System
Easy Student Management

You can manage all students from one dashboard.

Fast Results Processing

Marks and reports are generated quickly.

Better Data Storage

All records are stored securely in MySQL.

Professional School Operations

The system improves school management efficiency.

Conclusion

A PHP School Management System is one of the best projects for learning PHP PDO and MySQL.

Using:

PHP PDO
MySQL
Bootstrap 5
secure authentication
prepared statements

you can build a professional and scalable school system.

For more tutorials visit:

https://faulink.com

🚀 Unahitaji mfumo au website ya biashara?

Chagua huduma hapa chini kisha mteja bofya moja kwa moja kwenda kwenye ukurasa wa huduma au kuwasiliana nasi kwa WhatsApp.

Share this post

Comments

0
No comments yet. Be the first to comment.

Continue Reading

Subscribe

Get new updates

Jiunge upokee posts mpya, tutorials, na updates za mifumo moja kwa moja kwenye email yako.

Faulink Support