Create Crud using PHP OOP

min read

Day 6 #100DaysOfCode

Hôm này mình sẽ chỉnh sửa lại bài viết Create CRUD(create,read,update,delete) in PHP về cú pháp OOP(Object Oriented Programming) xử lý trong PHP. Nội dung bài viết trước mình đã làm hoàn thành xong, giờ chỉ cần sửa lại một số lệnh truy vấn, thêm, xóa, sửa về OOP thôi

+ File define.php : mình cập nhật sửa lại như sau

<?php
   /* config localhost */
    define("LOCALHOST","localhost");
    /* database name */
    define("DATABASE","admin_demo");
    /* username */
    define("USERNAME","root");
    /* password */
    define("PASSWORD","");
    $dsn = 'mysql:host='.LOCALHOST.';dbname='.DATABASE;
	    $options = array(
			PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
			PDO::ATTR_EMULATE_PREPARES => false, 
			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
			);
		
			$conn = new PDO($dsn,USERNAME, PASSWORD, $options);
		
?>

+ MYSQL_ATTR_INIT_COMMAND : cài đặt hiện thị tiếng việt
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION : dùng ném ngoại lệ khi gặp lỗi
+ PDO::ATTR_EMULATE_PREPARES: false => có nghĩa là nó tắt tính năng mô phỏng các câu lệnh đã chuẫn bị sẵn, nếu bạn cho bằng true, thì buộc PDO luôn mô phỏng các câu lệnh chuẩn bị giả lập, nếu câu lệnh giả lập chuẩn bị sai, thì nó sẽ quay lại mô phỏng các câu lệnh , nó sẽ báo lỗi cú pháp tại thời gian chuẩn bị, thay vì báo lỗi tại thời gian thực hiện

+ File index.php : Cập nhật lại

<?php
    require_once "define.php";
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Posts</title>
    <style>
        *{margin:0;padding:0;}
        
        header{
            width:100%;
            background:rgba(0,145,234,1);
            padding:20px 0px;
        }
        .box_posts{
            width:1000px;
            margin:30px auto;
        }
        table, td, th {
            border: 1px solid black;
            padding:10px;
            box-sizing:border-box;
        }

       a{
           text-decoration:none;
       }
        table {
            border-collapse: collapse;
        }
        span{
            padding: 5px 10px;
            box-sizing: border-box;
            
            color: #fff;
            font-size: 13px;
            border-radius: 5px;
        }
        .edit{
            background: #0d6efd;
        }
        .delete{
            background:#dc3545;
        }
        .add{
            width: 100px;
            display: block;
            padding: 5px;
            text-align: center;
            box-sizing: border-box;
            color: #fff;
          
            background: #198754;
            margin-bottom: 7px;
            border-radius: 5px;
            font-weight: bold;
            font-size: 14px;
        }
        .box_search{
            padding:10px 0px;
            box-sizing:border-box;
        }
        .box_search form > input{
            padding:5px 0px;
        }
        .pagination{
            width:100%;
            background:#ccc;
            padding:10px 0px;
        }
        .pagination ul{display:block;text-align:center;}
        .pagination ul li{
            list-style:none;
            padding:5px;
            box-sizing:border-box;
            display:inline-block;
            background:rgba(0,145,234,1);
           
        }
        .pagination ul li a{
            color:#fff;
        }
        .pagination ul li.active{
            background:#000;
            
        }
        .pagination ul li.active span{
            color:#fff;
        }
    </style>
</head>
<body>
    <header></header>
    <div class="box_posts">
     
        <?php
            $page = "home";
            if(isset($_GET["page"]) && $_GET["page"]!=""){
                $page=$_GET["page"];
            }
            switch($page){
                case "home":include "home.php";break;
                case "delete":include "delete.php";break;
                case "edit":include "edit.php";break;
                case "add":include "add.php";break;
                default :
                  include "home.php";
                  break;
            }

        ?>
    </div>
</body>
</html>

+ File home.php

    <?php
        $result = $conn->prepare("SELECT * FROM `posts`");
        $result->setFetchMode(PDO::FETCH_ASSOC); // FETCH_BOTH , FETCH_ASSOC
       /*  $result->setFetchMode(PDO::FETCH_CLASS,'posts');  */
        $result->execute();
        $data = $result->fetchAll();
        
        
    ?>
        <a href="?page=add" class="add">Add Post</a>
        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Title</th>
                    <th>Body</th>
                    <th>Slug</th>
                    <th>Modify</th>
                    <th>Remove</th>
                </tr>
            </thead>
            <tbody>
            <?php 
                $str = "";
                foreach($data as $row){
                
                     $str.="<tr>";
                        $str.="<td>".$row['idPost']."</td>";
                        $str.="<td>".$row['Title']."</td>";
                        $str.="<td>".$row['Body']."</td>";
                        $str.="<td>".$row['Slug']."</td>";
                        $str.="<td><a href='?page=edit&id=".$row['idPost']."'><span class='edit'>Edit</span></a></td>";
                        $str.="<td><a href='?page=delete&id=".$row['idPost']."'><span class='delete'>Delete</span></a></td>";
                    $str.="</tr>";
                }
                echo $str;
            ?>
            </tbody>
        </table>
        

Trong đoạn code trên mình có mình cần dùng FETCH_ASSOC để trả về dữ liệu mảng, sao đó mình dùng foreach để lập dữ liệu nó ra, nếu bạn thích trả về object  (FETCH_OBJ) thì cũng được nhé

 <?php
        $result = $conn->prepare("SELECT * FROM `posts`");
        $result->setFetchMode(PDO::FETCH_ASSOC); // FETCH_BOTH , FETCH_ASSOC
		/* 
	    class posts{}
	    $result->setFetchMode(PDO::FETCH_CLASS,'posts');  
		*/
        $result->execute();
        $data = $result->fetchAll();
        
        
    ?>
+ FETCH_ASSOC : trả về một mảng được lập chỉ mục theo tên cột như được trả về trong tập kết quả của bạn
+ FETCH_BOTH(mặc định) : trả về một mảng được lập chỉ mục bởi cả tên cột và số cột được lập chỉ mục 0 như được trả về trong tập kết quả của bạn
+ FETCH_CLASS : trả về một thể hiện mới của lớp được yêu cầu, ánh xạ các cột của tập kết quả thành các thuộc tính được đặt tên trong lớp và gọi hàm tạo sau đó
Còn nhiều thứ lắm, các bạn có thể tìm hiểu thêm tại đây: https://www.php.net/manual/en/pdostatement.fetch.php

+ File add.php

<?php
/* SET SUBMIT ADD POST */
if(isset($_POST["submit"])){
    if($_POST['Title'] !="" && $_POST["Body"]!="" && $_POST["Slug"]!=""){
        $data = [
            "Title"=>$_POST["Title"], 
            "Body"=>$_POST["Body"], 
            "Slug"=>$_POST["Slug"],
            
        ];
        $sql_insert = "INSERT INTO `posts`(`Title`,`Body`,`Slug`) VALUES(:Title,:Body,:Slug)";
        $query = $conn->prepare($sql_insert);
        $query->execute($data);
        if($query){
           $last_id = $conn->lastInsertId();
           header("Location:?page=home");
        }
    }
}

?>
<div class="box_edit">
<form action="" method="post">
    <h2>Add Post</h2>
    <div class="form-item">
        <label>Title</label>
        <input type="text" name="Title" placeholder="Title"/>
    </div>
    <div class="form-item">
        <label>Slug</label>
        <input type="text" name="Slug" placeholder="Slug" />
    </div>
    <div class="form-item">
        <label>Body</label>
        <textarea cols="20" rows="5" name="Body" placeholder="Body"></textarea>
    </div>
   
    <div class="form-item">
        <input type="submit" name="submit" value="Submit" />
    </div>
</form>
</div>
<style>
.box_edit{
    width:600px;
    margin:auto;
}
h2{
    font-size:23px;
    padding:5px;
    border-bottom:2px solid rgba(0,145,234,1);
    position:relative;
    z-index:1000;
    text-indent:10px;
    overflow: hidden;
    color:#fff;
    margin-bottom:10px;
}
h2::before{
    content: "";
    width: 200px;
    height: 100%;
    background: rgba(0,145,234,1);
    position: absolute;
    top: 0;
    left: -37px;
    z-index: -1;
    transform: skewX(30deg);
   
}
.form-item{
   margin-bottom:10px;
}
label{
    font-size:20px;
    display:block;
    font-weight:bold;
}
input,textarea{
    width:100%;
    padding:10px;
    box-sizing:border-box;
    border:none;
    box-shadow:0 0 1px  #000;
    outline:none;

}
input[type="submit"]{
    background: #000;
    color:#fff;
    font-weight:bold;
}

</style>

Trong đoạn code trên mình chỉnh sửa lại các câu lệnh truy vấn về OOP, mình cần dùng (prepare,execute) để thực thi câu lệnh, lastInsertId() sẽ trả về id vừa thêm

<?php
/* SET SUBMIT ADD POST */
if(isset($_POST["submit"])){
    if($_POST['Title'] !="" && $_POST["Body"]!="" && $_POST["Slug"]!=""){
        $data = [
            "Title"=>$_POST["Title"], 
            "Body"=>$_POST["Body"], 
            "Slug"=>$_POST["Slug"],
            
        ];
        $sql_insert = "INSERT INTO `posts`(`Title`,`Body`,`Slug`) VALUES(:Title,:Body,:Slug)";
        $query = $conn->prepare($sql_insert);
        $query->execute($data);
        if($query){
           $last_id = $conn->lastInsertId();
           header("Location:?page=home");
        }
    }
}

?>

+ File edit.php : Kiểm tra xem id có trong table "posts" không, nếu có thì thực hiện câu truy vấn,còn rowCount() sẽ trả về số record 

<?php

    $idPost = $_GET["id"];
    $sql_edit = "SELECT * FROM `posts` WHERE `posts`.`idPost`=".$idPost;
    $result = $conn->prepare($sql_edit);
    $result->setFetchMode(PDO::FETCH_ASSOC); // FETCH_BOTH , FETCH_ASSOC
    $result->execute();
    if($result->rowCount()>0){
        $post = $result->fetch();

    }else{

        echo "<script>alert('idPost không tồn tại');</script>";

        echo "<script>window.location.href='?page=home';</script>";
    }

    /* SET SUBMIT EDIT */
    if(isset($_POST["submit"])){
        if($_POST['Title'] !="" && $_POST["Body"]!="" && $_POST["Slug"]!=""){
            $data = [
                "Title"=>$_POST["Title"], 
                "Body"=>$_POST["Body"], 
                "Slug"=>$_POST["Slug"],
                "idPost"=>$idPost
            ];
            $sql_update = "UPDATE `posts` SET Title=:Title,Body=:Body,Slug=:Slug WHERE idPost=:idPost";
            $query = $conn->prepare($sql_update);
            $query->execute($data);
            if($query){
                header("Location:?page=home");
            }
        }
    }


?>
<div class="box_edit">
    <form action="" method="post">
        <h2>Update Post</h2>
        <div class="form-item">
            <label>Title</label>
            <input type="text" name="Title" placeholder="Title" value="<?php echo $post["Title"];?>" />
        </div>
        <div class="form-item">
            <label>Slug</label>
            <input type="text" name="Slug" placeholder="Slug" value="<?php echo $post["Slug"];?>" />
        </div>
        <div class="form-item">
            <label>Body</label>
            <textarea cols="20" rows="5" name="Body"
                placeholder="Body"><?php echo strip_tags($post["Body"]);?></textarea>
        </div>

        <div class="form-item">
            <input type="submit" name="submit" value="Submit" />
        </div>
    </form>
</div>
<style>
.box_edit {
    width: 600px;
    margin: auto;
}

h2 {
    font-size: 23px;
    padding: 5px;
    border-bottom: 2px solid rgba(0, 145, 234, 1);
    position: relative;
    z-index: 1000;
    text-indent: 10px;
    overflow: hidden;
    color: #fff;
    margin-bottom: 10px;
}

h2::before {
    content: "";
    width: 200px;
    height: 100%;
    background: rgba(0, 145, 234, 1);
    position: absolute;
    top: 0;
    left: -37px;
    z-index: -1;
    transform: skewX(30deg);

}

.form-item {
    margin-bottom: 10px;
}

label {
    font-size: 20px;
    display: block;
    font-weight: bold;
}

input,
textarea {
    width: 100%;
    padding: 10px;
    box-sizing: border-box;
    border: none;
    box-shadow: 0 0 1px #000;
    outline: none;

}

input[type="submit"] {
    background: #000;
    color: #fff;
    font-weight: bold;
}
</style>

+ File delete.php 

<?php
    if(isset($_GET["id"]) && $_GET["id"]){
        $idPost = $_GET["id"];
        $data=[
            "idPost"=>$_GET["id"]
        ];
        $sql_check = "SELECT * FROM `posts` WHERE `idPost`=:idPost";
        $check = $conn->prepare($sql_check);
        $check->execute($data);
        if($check->rowCount()>0){
           
            $sql_delete = "DELETE FROM `posts` WHERE `idPost`=:idPost";
            $result = $conn->prepare($sql_delete);
            $result->execute($data);
            if($result){
                header("Location:?page=home");
            }
            
        }
        header("Location:?page=home");
    }
    header("Location:?page=home");

?>

Okay vậy là xong ngày thứ 6 #100DaysOfCode, mình cũng học được nhiều thứ

x

Ủng hộ tôi bằng cách click vào quảng cáo. Để tôi có kinh phí tiếp tục phát triển Website!(Support me by clicking on the ad. Let me have the money to continue developing the Website!)