Bootstrap 5.1 Version
https://getbootstrap.com/docs/5.1/getting-started/introduction/
https://bootstrap-vue.org/
https://bootstrap-vue.org/docs/components/modal#modals
https://vuejs.org/v2/guide/
CREATE TABLE `vueuser` (
`id` int(11) NOT NULL,
`name` varchar(30) NOT NULL,
`email` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `vueuser` (`id`, `name`, `email`) VALUES
(1, 'cairocoders', 'cairocoders@gmail.com'),
(2, 'tutorial101.blogspot.com', 'tutorial101@gmail.com'),
(3, 'Ashton Cox', 'AshtonCox@gmail.com'),
(4, 'Bradley Greer', 'BradleyGreer@gmail.com'),
(5, 'Clydey Ednalan', 'clydeyednalan@gmail.com');
ALTER TABLE `vueuser`
ADD PRIMARY KEY (`id`);
ALTER TABLE `vueuser`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
index.php
//index.php <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous"> <link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.css" /> <title>Vuejs PHP OOP PDO Mysql CRUD (Create, Read, Update and Delete)</title> <style> [v-cloak] { display: none; } </style> </head> <body class="bg-light"> <div class="container" id="app" v-cloak> <div class="row"> <div class="col-md-10"><h3>Vuejs PHP OOP PDO Mysql CRUD (Create, Read, Update and Delete)</h3> <div class="card"> <div class="card-header"> <div class="d-flex d-flex justify-content-between"> <div class="lead">PHP PDO VUEJS CRUD</div> <button id="show-btn" @click="showModal('my-modal')" class="btn btn-primary">Add Records</button> </div> </div> <div class="card-body"> <div class="text-muted lead text-center" v-if="!records.length">No record found</div> <div class="table table-success table-striped" v-if="records.length"> <table class="table table-borderless"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Email</th> <th>Action</th> </tr> </thead> <tbody> <tr v-for="(record, i) in records" :key="record.id"> <td>{{i + 1}}</td> <td>{{record.name}}</td> <td>{{record.email}}</td> <td> <a href="#" @click.prevent="deleteRecord(record.id)" class="btn btn-danger">Delete</a> <a href="#" @click.prevent="editRecord(record.id)" class="btn btn-primary">Edit</a> </td> </tr> </tbody> </table> </div> </div> </div> <!-- Add Records Modal --> <b-modal ref="my-modal" hide-footer title="Add Records"> <form action="" @submit.prevent="onSubmit"> <div class="form-group"> <label for="">Name</label> <input type="text" v-model="name" class="form-control"> </div> <div class="form-group"> <label for="">Email</label> <input type="email" v-model="email" class="form-control"> </div> <div class="form-group"> <button class="btn btn-sm btn-outline-info">Add Records</button> </div> </form> <b-button class="mt-3" variant="outline-danger" block @click="hideModal('my-modal')">Close Me</b-button> </b-modal> <!-- Update Record Modal --> <div> <b-modal ref="my-modal1" hide-footer title="Update Record"> <div> <form action="" @submit.prevent="onUpdate"> <div class="form-group"> <label for="">Name</label> <input type="text" v-model="edit_name" class="form-control"> </div> <div class="form-group"> <label for="">Email</label> <input type="email" v-model="edit_email" class="form-control"> </div> <div class="form-group"> <button class="btn btn-sm btn-outline-info">Update Record</button> </div> </form> </div> <b-button class="mt-3" variant="outline-danger" block @click="hideModal('my-modal1')">Close Me</b-button> </b-modal> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <!-- BootstrapVue js --> <script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.js"></script> <!-- Axios --> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script src="js/app.js"></script> </body> </html>app.js
//app.js var app = new Vue({ el: "#app", data: { name: "", email: "", records: [], edit_id: "", edit_name: "", edit_email: "", }, methods: { showModal(id) { this.$refs[id].show(); }, hideModal(id) { this.$refs[id].hide(); }, onSubmit() { if (this.name !== "" && this.email !== "") { var fd = new FormData(); fd.append("name", this.name); fd.append("email", this.email); axios({ url: "insert.php", method: "post", data: fd, }) .then((res) => { if (res.data.res == "success") { app.makeToast("Success", "Record Added", "default"); this.name = ""; this.email = ""; app.hideModal("my-modal"); app.getRecords(); } else { app.makeToast("Error", "Failed to add record. Please try again", "default"); } }) .catch((err) => { console.log(err); }); } else { alert("All field are required"); } }, getRecords() { axios({ url: "records.php", method: "get", }) .then((res) => { this.records = res.data.rows; }) .catch((err) => { console.log(err); }); }, deleteRecord(id) { if (window.confirm("Delete this record")) { var fd = new FormData(); fd.append("id", id); axios({ url: "delete.php", method: "post", data: fd, }) .then((res) => { if (res.data.res == "success") { app.makeToast("Success", "Record delete successfully", "default"); app.getRecords(); } else { app.makeToast("Error", "Failed to delete record. Please try again", "default"); } }) .catch((err) => { console.log(err); }); } }, editRecord(id) { var fd = new FormData(); fd.append("id", id); axios({ url: "edit.php", method: "post", data: fd, }) .then((res) => { if (res.data.res == "success") { this.edit_id = res.data.row[0]; this.edit_name = res.data.row[1]; this.edit_email = res.data.row[2]; app.showModal("my-modal1"); } }) .catch((err) => { console.log(err); }); }, onUpdate() { if ( this.edit_name !== "" && this.edit_email !== "" && this.edit_id !== "" ) { var fd = new FormData(); fd.append("id", this.edit_id); fd.append("name", this.edit_name); fd.append("email", this.edit_email); axios({ url: "update.php", method: "post", data: fd, }) .then((res) => { if (res.data.res == "success") { app.makeToast("Sucess", "Record update successfully", "default"); this.edit_name = ""; this.edit_email = ""; this.edit_id = ""; app.hideModal("my-modal1"); app.getRecords(); } }) .catch((err) => { app.makeToast("Error", "Failed to update record", "default"); }); } else { alert("All field are required"); } }, makeToast(vNodesTitle, vNodesMsg, variant) { this.$bvToast.toast([vNodesMsg], { title: [vNodesTitle], variant: variant, autoHideDelay: 1000, solid: true, }); }, }, mounted: function () { this.getRecords(); }, });model.php
//model.php <?php class Model { private $server = 'localhost'; private $username = 'root'; private $password = ''; private $db = 'testingdb'; private $conn; public function __construct() { try { $this->conn = new PDO("mysql:host=$this->server;dbname=$this->db", $this->username, $this->password); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); } } public function store($name, $email) { $stmt = $this->conn->prepare("INSERT INTO `vueuser` (`name`, `email`) VALUES ('$name', '$email')"); if ($stmt->execute()) { return true; } else { return; } } public function findAll() { $data = []; $stmt = $this->conn->prepare("SELECT * FROM `vueuser` ORDER BY `id` ASC"); if ($stmt->execute()) { $data = $stmt->fetchAll(); } return $data; } public function destroy($id) { $stmt = $this->conn->prepare("DELETE FROM `vueuser` WHERE `id` = '$id'"); if ($stmt->execute()) { return true; } else { return; } } public function findOne($id) { $data = []; $stmt = $this->conn->prepare("SELECT * FROM `vueuser` WHERE `id` = '$id'"); if ($stmt->execute()) { $data = $stmt->fetch(); } return $data; } public function update($id, $name, $email) { $stmt = $this->conn->prepare("UPDATE `vueuser` SET `name` = '$name', `email` = '$email' WHERE `id` = '$id'"); if ($stmt->execute()) { return true; } else { return; } } }records.php
//records.php <?php include 'model.php'; $model = new Model(); $rows = $model->findAll(); $data = array('rows' => $rows); echo json_encode($data);insert.php
//insert.php <?php if (isset($_POST['name']) && isset($_POST['email'])) { $name = $_POST['name']; $email = $_POST['email']; include 'model.php'; $model = new Model(); if ($model->store($name, $email)) { $data = array('res' => 'success'); }else{ $data = array('res' => 'error'); } echo json_encode($data); }edit.php
//edit.php <?php if (isset($_POST['id'])) { $id = $_POST['id']; include 'model.php'; $model = new Model(); if ($row = $model->findOne($id)) { $data = array('res' => 'success', 'row' => $row); }else{ $data = array('res' => 'error'); } echo json_encode($data); }update.php
//update.php <?php if (isset($_POST['id']) && isset($_POST['name']) && isset($_POST['email'])) { $id = $_POST['id']; $name = $_POST['name']; $email = $_POST['email']; include 'model.php'; $model = new Model(); if ($model->update($id, $name, $email)) { $data = array('res' => 'success'); }else{ $data = array('res' => 'error'); } echo json_encode($data); } ?>delete.php
//delete.php <?php if (isset($_POST['id'])) { $id = $_POST['id']; include 'model.php'; $model = new Model(); if ($model->destroy($id)) { $data = array('res' => 'success'); }else{ $data = array('res' => 'error'); } echo json_encode($data); }