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(); ?>
+ 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ứ