CRUD Application with PHP PDO Ajax, and MySQL Part 2
In the second part of this tutorial, we will get all the students from the database and display them on the home page, next, we will see how to create update, and delete students.
Update student
Inside the public folder add a new file and name it “updateStudent.php” Inside we will have the code to update an existing student in the database.
<?php include "../database/db.php";
if($_SERVER["REQUEST_METHOD"] === "GET") { $student_id = $_GET["id"];
$stmt = $conn->prepare("SELECT * FROM students WHERE id=:student_id ");
$stmt->bindParam(":student_id",$student_id,PDO::PARAM_INT);
$stmt->execute();
$student = $stmt->fetch(PDO::FETCH_ASSOC);
$response = [ "status" => 200, "student" => $student ];
echo json_encode($response);
return;}
if($_SERVER["REQUEST_METHOD"] === "POST") { $student_id = $_POST["student_id"]; $name = $_POST["name"]; $regist_number = $_POST["regist_number"]; $avg = $_POST["avg"]; $move_next = $_POST["move_next"];
$stmt = $conn->prepare("UPDATE students set name=:name,regist_number=:regist_number, avg=:avg,move_next=:move_next WHERE id=:student_id ");
$stmt->bindParam(":student_id",$student_id,PDO::PARAM_INT); $stmt->bindParam(":name",$name); $stmt->bindParam(":regist_number",$regist_number); $stmt->bindParam(":avg",$avg); $stmt->bindParam(":move_next",$move_next);
$updated = $stmt->execute();
if($updated) { $content = "";
$stmt = $conn->prepare("SELECT * FROM students");
$stmt->execute();
$students = $stmt->fetchAll(PDO::FETCH_ASSOC);
$content = "";
foreach($students as $key => $student) { $content .= "<tr>"; $content .= "<td>".++$key."</td>"; $content .= "<td>".$student['name']."</td>"; $content .= "<td>".$student['regist_number']."</td>"; $content .= "<td>".$student['avg']."</td>"; $content .= "<td>".$student['move_next']."</td>"; $content .= '<td> <button type="button" value="'.$student['id'].'" class="btn btn-sm btn-warning btn__update" data-bs-toggle="modal" data-bs-target="#editStudentModal"> <i class="fas fa-edit"></i> </button> <button type="button" value="'.$student['id'].'" class="btn btn-sm btn-danger btn__delete"> <i class="fas fa-trash"></i> </button> </td>'; $content .= "</tr>"; }
$response = [ "status" => 200, "message" => "Student updated successfully", "content" => $content ];
echo json_encode($response);
return; }else { $response = [ "status" => 500, "message" => "Student not updated" ];
echo json_encode($response);
return; }}
Delete student
Inside the public folder add a new file and name it “deleteStudent.php” Inside we will have the code to remove an existing student from the database.
<?php include "../database/db.php";
if($_SERVER["REQUEST_METHOD"] === "GET") { $student_id = $_GET["id"];
$stmt = $conn->prepare("DELETE FROM students WHERE id=:student_id");
$stmt->bindParam(":student_id",$student_id,PDO::PARAM_INT);
$deleted = $stmt->execute();
if($deleted) { $content = "";
$stmt = $conn->prepare("SELECT * FROM students");
$stmt->execute();
$students = $stmt->fetchAll(PDO::FETCH_ASSOC);
$content = "";
foreach($students as $key => $student) { $content .= "<tr>"; $content .= "<td>".++$key."</td>"; $content .= "<td>".$student['name']."</td>"; $content .= "<td>".$student['regist_number']."</td>"; $content .= "<td>".$student['avg']."</td>"; $content .= "<td>".$student['move_next']."</td>"; $content .= '<td> <button type="button" value="'.$student['id'].'" class="btn btn-sm btn-warning btn__update" data-bs-toggle="modal" data-bs-target="#editStudentModal"> <i class="fas fa-edit"></i> </button> <button type="button" value="'.$student['id'].'" class="btn btn-sm btn-danger btn__delete"> <i class="fas fa-trash"></i> </button> </td>'; $content .= "</tr>"; }
$response = [ "status" => 200, "message" => "Student deleted successfully", "content" => $content ];
echo json_encode($response);
return; }else { $response = [ "status" => 500, "message" => "Student not deleted" ];
echo json_encode($response);
return; }}
Add the header
Inside the public folder add a new folder and name it “layouts” Inside add a new file and name it “header.php” and add the code below inside.
<?php include '../database/db.php'; ?><!doctype html><html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>PHP Ajax CRUD App</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> </head> <body class="bg-light">
Add the footer
Inside the “layouts” folder add a new file and name it “footer.php” Inside add the code below.
<script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script> </body>
</html>
Add the home page
Inside the public folder add a new file and name it “index.php” Inside we will have the code to display all the students with the create update and delete links.
The source code is here.
<?php include "./layouts/header.php";
$stmt = $conn->prepare("SELECT * FROM students");
$stmt->execute();
$students = $stmt->fetchAll(PDO::FETCH_ASSOC);
//include the modalsinclude "./modals/studentSaveModal.php";include "./modals/studentUpdateModal.php";?><div class="container"> <div class="row my-4"> <div class="col-md-10 mx-auto"> <div class="my-3 d-none" id="alert__message"> <div class="alert alert-success alert-dismissible fade show" role="alert"> <strong id="message__content"></strong> <button type="button" class="btn-close"></button> </div> </div> <div class="my-3"> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#saveStudentModal"> <i class="fas fa-plus"></i> Add </button> </div> <div class="card"> <div class="card-body"> <table class="table"> <thead> <tr> <th>#</th> <th>Name</th> <th>Registration Number</th> <th>Average</th> <th>Decision</th> <th></th> </tr> </thead> <tbody id="bodyContent"> <?php foreach($students as $key => $student): ?> <tr> <td><?php echo $key+=1; ?></td> <td><?php echo $student['name']; ?></td> <td><?php echo $student['regist_number']; ?></td> <td><?php echo $student['avg']; ?></td> <td><?php echo $student['move_next']; ?></td> <td> <button type="button" value="<?php echo $student['id']; ?>" class="btn btn-sm btn-warning btn__update" data-bs-toggle="modal" data-bs-target="#editStudentModal"> <i class="fas fa-edit"></i> </button> <button type="button" value="<?php echo $student['id']; ?>" class="btn btn-sm btn-danger btn__delete"> <i class="fas fa-trash"></i> </button> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> </div></div><?php include "./layouts/footer.php"; ?><script> $(document).on('submit','#saveStudentForm',function(e){ e.preventDefault(); const formData = new FormData(this);
$.ajax({ type: "POST", url: "storeStudent.php", data: formData, processData:false, contentType:false, success: function(response) { const res = JSON.parse(response); if(res.status == 200) { $('#saveStudentModal').modal("hide"); $('#saveStudentForm')[0].reset(); $('#bodyContent').html(res.content); $('#message__content').text(res.message); $('#alert__message').removeClass("d-none"); }else if(res.status == 500) { alert(res.message); }else { alert("Something went wrong try again later!"); } } }) }); $(document).on('click','.btn__update',function(){ const student_id = $(this).val();
$.ajax({ type: "GET", url: "updateStudent.php?id=" + student_id, success: function(response) { const res = JSON.parse(response); if(res.status == 200) { $('#name').val(res.student.name); $('#regist_number').val(res.student.regist_number); $('#avg').val(res.student.avg); $('#move_next').val(res.student.move_next); $('#student_id').val(res.student.id); $('#studentUpdateModal').modal("show"); }else if(res.status == 404) { alert(res.message); }else { alert("Something went wrong try again later!"); } } }) }); $(document).on('submit','#editStudentForm',function(e){ e.preventDefault(); const formData = new FormData(this);
$.ajax({ type: "POST", url: "updateStudent.php", data: formData, processData:false, contentType:false, success: function(response) { const res = JSON.parse(response); if(res.status == 200) { $('#editStudentModal').modal("hide"); $('#editStudentForm')[0].reset(); $('#bodyContent').html(res.content); $('#message__content').text(res.message); $('#alert__message').removeClass("d-none"); }else if(res.status == 500) { alert(res.message); }else { alert("Something went wrong try again later!"); } } }) }); $(document).on('click','.btn__delete',function(){ if(confirm("are you sure ?")) { const student_id = $(this).val();
$.ajax({ type: "GET", url: "deleteStudent.php?id=" + student_id, success: function(response) { const res = JSON.parse(response); if(res.status == 200) { $('#bodyContent').html(res.content); $('#message__content').text(res.message); $('#alert__message').removeClass("d-none"); }else if(res.status == 500) { alert(res.message); }else { alert("Something went wrong try again later!"); } } }) } }); $(document).on('click','.btn-close',function(){ $('#alert__message').addClass("d-none"); })</script>