40% off everything — use code SAVE40 at checkout · ends in …
Skip to content
phpguru.store

School Management System Project in PHP with Source Code and Report

By Prakash Panthi, Founder · Published September 30, 2026 · Updated September 30, 2026

A school management system project in PHP is the most common final-year title for BCA, MCA and B.Tech students — and the one most often submitted half-working, because a real school ERP is big. This guide shows what a complete one contains (roles, modules, tables), how to run it on XAMPP, what the project report must cover chapter by chapter, and the viva questions examiners ask about the database design. It is written around our School Management System in PHP, a CodeIgniter 3 application with 69 tables, but the structure applies to any school project.

Four roles, twelve modules

The system has an administrator (everything), teachers (attendance, marks, assignments, routine), students (routine, attendance, results, invoices) and guardians (each child's attendance, results and fees). The modules:

  • Administrator & settings — users, roles, privileges, school settings, languages.
  • Academic — academic years, classes (with fee amounts), sections, subjects, routines, syllabus, enrolments.
  • Student & guardian — admission with photo and guardian, membership flags for library, hostel and transport.
  • Teacher & HRM — teachers, employees, designations, staff attendance.
  • Attendance — daily student attendance, stored per month.
  • Exam & result — exams, schedules, marks, grades, results, mark sheets by email/SMS.
  • Assignment, Accounting & fees (invoices, transactions, income/expenditure), Payroll (salary grades and payments), Library, Hostel & transport, and Communication & website (notices, events, messages, gallery, public pages).

Everything is a CodeIgniter HMVC module: one folder per feature with its own controllers, models and views. That is why 25 module folders and 69 tables stay manageable — and why "what is HMVC?" is a guaranteed viva question.

The database decisions worth explaining

Enrolments are separate from students

students is the master record; enrollments says which class, section and roll number a student has in an academic year. Promotion to the next class is one new enrolment row, and last year's marks and fees still point at the correct class.

One student admission touches four tables

Admission inserts (or reuses) a guardians row, a users row for the login (with the student role and a hashed password), the students row with user_id and guardian_id, and an enrollments row. Draw that as your level-1 DFD process and you have a strong diagram.

Attendance is stored per month

student_attendances has one row per student per month with columns day_1 … day_31. The monthly sheet is one query with no aggregation; the trade-off is that it is denormalised. Being able to say "this is a deliberate denormalisation for read speed" is exactly what examiners want to hear.

Marks → grade → result

marks stores the obtained mark per student, exam and subject; on save the grade whose range contains the mark is looked up in grades. results then holds the computed total and average grade point per student and exam, which is what the dashboards and the printable mark sheet read.

Fees: class → invoice → transactions

Each class stores its monthly tuition and one-off fees. An invoice copies the fee into gross_amount, applies the student's discount to get net_amount; every payment is a transactions row, and the invoice becomes paid when they add up.

Running it on XAMPP

  1. Install XAMPP and start Apache and MySQL.
  2. Copy the school folder into htdocs.
  3. Create a database in phpMyAdmin (for example school_db) and import mindsuxn_school.sql — 69 tables.
  4. Edit application/config/database.php (host, user, password, database) and set $config['base_url'] in config.php to http://localhost/school/.
  5. Open http://localhost/school/, log in as the administrator, create an academic year, a class, a section and a subject, then admit a test student.

The most common failure is a blank page after login: almost always a wrong base_url or a database name that does not match. Our licence guide is worth reading before you deploy anything you downloaded elsewhere — many free school projects are marked educational-use only.

What the project report must contain

ChapterFor a school management system
AbstractRoles, modules, CodeIgniter + MySQL, 69 tables, the admission-attendance-exam-fee flow.
1. IntroductionProblem (registers and spreadsheets, manual results, untracked dues), objectives, scope.
2. System analysisExisting vs proposed, feasibility, 14 functional requirements, non-functional, hardware/software.
3. System designArchitecture (MVC + HMVC), roles table, modules with their tables, DFD level 0/1, 16 ER relationships, use cases.
4. Database designThe 22 core tables with columns and keys, and an appendix listing all 69.
5. ImplementationFolder structure, install steps, the four workflows above, security (privileges, hashing, query builder), declaration of the licensed base.
6. TestingAdmission, duplicate registration, attendance, marks above full mark, result computation, invoice with discount, partial payment, guardian data isolation, salary computation, SQL injection.
7. ScreenshotsYour installation: admission form, attendance screen, mark entry, mark sheet, invoice, the four dashboards.
8. Conclusion & future scopeOnline fee payment, parent app, SMS alerts, biometric attendance, online exams.

The product download now includes a college-project-pack folder with this report as a Word template — the database chapter is generated from the real .sql — plus 29 viva questions and a README on declaring the base. Details on the college projects page.

Sample viva questions

Q. Why is there an enrollments table when students already exists?
Students is the master record; enrollments is the yearly placement. Promotion is a new enrolment row and history stays correct.

Q. How do you stop a guardian seeing another student's marks by changing the id in the URL?
The model filters students by the logged-in guardian's id before returning anything; a foreign id simply returns nothing.

Q. What is the query builder and why use it?
CodeIgniter's API that builds and escapes SQL for you — no string concatenation, so no SQL injection from those queries.

Q. Where are permissions stored?
In roles, modules, operations and privileges; the base controller checks the privilege on every request, which is how one code base gives four menus.

Make it yours

  • Add a canteen or bus-fee module as a new HMVC module with its own table — the cleanest way to show you understand the structure.
  • Add a class-wise result analysis report (pass percentage per subject) with a chart.
  • Add an SMS/email alert on absence using the existing sms_settings and emails tables.
  • Enable CSRF protection in config.php and document it in the security section.

Whatever you add, update the ER list, the test cases and the conclusion so the report describes the system you actually demo.

Originality

A licensed base is fine; an undeclared one is not. Keep the declaration paragraph in the implementation chapter, describe your own work on top, and check your university's plagiarism policy. Pick a project size you can explain in full — a 69-table ERP is only a good choice if you have the time to run every module.

Start here: the School Management System in PHP — full source code, database, report template and viva questions in one download.

Available systems in this category

The system this guide was written for is not available for new purchases right now. These PHPGuru-developed systems cover related needs — check each page for exactly what it includes.