Download Source Code PHP and SQLite3 Grade Point Average (GPA) Calculator
Grade Point Average (GPA) Calculator Project Overview
This mini-project, titled Grade Point Average (GPA) Calculator, is a web application designed to help students easily calculate their GPA. It is developed using PHP and SQLite and provides an automated platform for GPA calculation. The project features a simple and intuitive user interface built with Bootstrap Framework and includes several useful functionalities for students.
How the Grade Point Average (GPA) Calculator Works:
The GPA Calculator is an easy-to-use web application that allows students to calculate their GPA for each semester. The application lets users manage the Grade Table, which defines the grade scale (e.g., 4.0) and corresponding letter grades (e.g., A+). Users can update the grade table by entering the grade letter, grade percentage range, and grade scale. While the application calculates the GPA, it does not store student records in a database. However, users can print the results to keep a record.
Features and Functionalities:
The GPA Calculator offers the following features:
- Grade Table Management:
- Add or remove rows in the grade table.
- Confirmation prompt when removing rows.
- GPA Calculation:
- Add course grades.
- Remove course grades.
- Automatically calculate the subtotal and grade percentage/average.
- Generate the grade scale and letter.
Technologies Used:
The project was developed using the following technologies:
- XAMPP
- VS Code Editor
- HTML
- CSS
- JavaScript
- jQuery
- Ajax
- Bootstrap v5 Framework
How to Run the GPA Calculator:
Follow these steps to set up and run the GPA Calculator:
Requirements:
- Install a local web server such as XAMPP or WAMP.
- Download the source code zip file (provided below).
Installation/Setup:
- Open the
php.ini
file in XAMPP/WAMP and uncomment the SQLite3 extension. Save the file. - Start the Apache server using the XAMPP/WAMP control panel.
- Extract the downloaded zip file.
- If using XAMPP, copy the extracted folder to the
htdocs
directory. For WAMP, paste it into thewww
directory. - Open a browser and visit http://localhost/php-sqlite-gpa-calculator/ to access the application.
Once set up, you can start using the GPA Calculator to calculate and manage your GPA data.
This GPA Calculator project is intended for educational purposes and can be modified to suit personal or academic needs.
index PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
<?php session_start(); require_once('DBConnection.php'); $page=$_GET['page'] ?? "home"; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GPA Calculator</title> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" /> <link rel="stylesheet" href="css/bootstrap.min.css"> <link rel="stylesheet" href="css/custom.css"> <script src="js/jquery-3.6.0.min.js"></script> <script src="js/popper.min.js"></script> <script src="js/bootstrap.min.js"></script> <script src="js/script.js"></script> </head> <body> <main> <nav class="navbar navbar-expand-lg navbar-dark bg-primary bg-gradient" id="topNavBar"> <div class="container"> <a class="navbar-brand" href="./"> GPA Calculator </a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link <?php echo ($page == 'home')? 'active' : '' ?>" aria-current="page" href="./">Home</a> </li> <li class="nav-item"> <a class="nav-link <?php echo ($page == 'grade_table')? 'active' : '' ?>" aria-current="page" href="./?page=grade_table">Grade Table</a> </li> </ul> </div> </div> </nav> <div class="container-md py-3" id="page-container"> <div class="my-4"> <?php if(isset($_SESSION['message']['success'])): ?> <div class="alert alert-success py-3 rounded-0"> <?= $_SESSION['message']['success'] ?> </div> <?php unset($_SESSION['message']['success']) ?> <?php endif; ?> <?php if(isset($_SESSION['message']['error'])): ?> <div class="alert alert-danger py-3 rounded-0"> <?= $_SESSION['message']['error'] ?> </div> <?php unset($_SESSION['message']['error']) ?> <?php endif; ?> <?php include($page.".php"); ?> </div> </div> <footer class="position-fixed bottom-0 w-100 bg-gradient bg-light"> <div class="lh-1 container py-3"> <div class="text-center">All rights reserved © <?= date("Y") ?> - GPA Calculator</div> <div class="text-center">Developed by:<a href="mailto:oretnom23@gmail.com" class='text-body-tertiary'>oretnom23</a></div> </div> </footer> <div class="modal fade" id="expenseModal" tabindex="-1"> <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable rounded-0"> <div class="modal-content"> <div class="modal-header rounded-0"> <h5 class="modal-title"></h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body rounded-0"> <div class="container-fluid"> <form action="" id="expense-form"> <input type="hidden" name="formToken" value="<?= $_SESSION['formToken']['expense-form'] ?>"> <input type="hidden" name="expense_id" value=""> <div class="mb-3"> <label for="name">Name</label> <input type="text" class="form-control rounded-0" id="name" name="name" required="required"> </div> <div class="mb-3"> <label for="amount">Amount</label> <input type="number" step="any" min="0" class="form-control rounded-0 text-end" id="amount" name="amount" required="required" value="0"> </div> </form> </div> </div> <div class="modal-footer"> <button type="submit" class="btn btn-primary rounded-0" form="expense-form">Save</button> <button type="button" class="btn btn-secondary rounded-0" data-bs-dismiss="modal">Close</button> </div> </div> </div> </div> <div class="modal fade" id="earningModal" tabindex="-1"> <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable rounded-0"> <div class="modal-content"> <div class="modal-header rounded-0"> <h5 class="modal-title"></h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body rounded-0"> <div class="container-fluid"> <form action="" id="earning-form"> <input type="hidden" name="formToken" value="<?= $_SESSION['formToken']['earning-form'] ?>"> <input type="hidden" name="earning_id" value=""> <div class="mb-3"> <label for="name">Name</label> <input type="text" class="form-control rounded-0" id="name" name="name" required="required"> </div> <div class="mb-3"> <label for="amount">Amount</label> <input type="number" step="any" min="0" class="form-control rounded-0 text-end" id="amount" name="amount" required="required" value="0"> </div> </form> </div> </div> <div class="modal-footer"> <button type="submit" class="btn btn-primary rounded-0" form="earning-form">Save</button> <button type="button" class="btn btn-secondary rounded-0" data-bs-dismiss="modal">Close</button> </div> </div> </div> </div> <script> $(function(){ $('#expense-form').submit(function(e){ e.preventDefault(); $('.pop_msg').remove() var _this = $(this) var _el = $('<div>') _el.addClass('pop_msg') start_loader() $.ajax({ url:'./Master.php?a=save_expense', method:'POST', data:$(this).serialize(), dataType:'JSON', error:err=>{ console.log(err) _el.addClass('alert alert-danger') _el.text("An error occurred.") _this.prepend(_el) _el.show('slow') }, success:function(resp){ if(resp.status == 'success'){ _el.addClass('alert alert-success') location.reload(); }else{ _el.addClass('alert alert-danger') } _el.text(resp.msg) _el.hide() _this.prepend(_el) _el.show('slow') end_loader() } }) }) $('#earning-form').submit(function(e){ e.preventDefault(); $('.pop_msg').remove() var _this = $(this) var _el = $('<div>') _el.addClass('pop_msg') start_loader() $.ajax({ url:'./Master.php?a=save_earning', method:'POST', data:$(this).serialize(), dataType:'JSON', error:err=>{ console.log(err) _el.addClass('alert alert-danger') _el.text("An error occurred.") _this.prepend(_el) _el.show('slow') }, success:function(resp){ if(resp.status == 'success'){ _el.addClass('alert alert-success') location.reload(); }else{ _el.addClass('alert alert-danger') } _el.text(resp.msg) _el.hide() _this.prepend(_el) _el.show('slow') end_loader() } }) }) }) </script> </body> </html> |
Master PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<?php if(session_id() ==="") session_start(); require_once('DBConnection.php'); /** * Login Registration Class */ Class Master extends DBConnection{ function __construct(){ parent::__construct(); } function __destruct(){ parent::__destruct(); } function save_grade_tbl(){ extract($_POST); $data = []; if(isset($grade_letter)){ foreach($grade_letter as $k => $v){ $data[] = "('{$v}', '{$grade_from[$k]}', '{$grade_to[$k]}', '{$scale[$k]}')"; } } if(!empty($data)){ $data = implode(", ", $data); $trucate = $this->query("DELETE FROM `grade_table`"); $update_seq = $this->query("UPDATE `sqlite_sequence` SET `seq` = 0 WHERE `name` = 'grade_table'"); $sql = "INSERT INTO `grade_table` (`letter_grade`, `grade_from`, `grade_to`, `scale`) VALUES {$data}"; $insert = $this->query($sql); if($insert){ $resp['status'] = 'success'; $resp['msg'] = "GPA Grade Table has been updated successfully."; $_SESSION['message']['success'] = $resp['msg']; }else{ $resp['status'] = 'failed'; $resp['msg'] = $this->lastErrorMsg(); } }else{ $resp['status'] = 'failed'; $resp['msg'] = "There's no data sent to the request."; } return json_encode($resp); } function get_grade_tbl(){ $sql = "SELECT * FROM `grade_table` order by `grade_to` desc, `grade_from` desc"; $qry = $this->query($sql); $data = []; while($row = $qry->fetchArray(SQLITE3_ASSOC)){ $row['scale'] = number_format($row['scale'], 1); $data[] = $row; } return json_encode($data); } function get_scale(){ extract($_POST); $sql = "SELECT * FROM `grade_table` where '{$perc}' >= `grade_from` and '{$perc}' <= `grade_to`"; $qry = $this->querySingle($sql, true); $data = []; if($qry){ $qry['scale'] = number_format($qry['scale'], 1); $data = $qry; } return json_encode($data); } } $a = isset($_GET['a']) ?$_GET['a'] : ''; $master = new Master(); switch($a){ case 'save_grade_tbl': echo $master->save_grade_tbl(); break; case 'get_grade_tbl': echo $master->get_grade_tbl(); break; case 'get_scale': echo $master->get_scale(); break; default: // default action here break; } |