Nền tảng Kiến thức - Hành trang tới Tương lai
Card image

Chương 6-Bài 1. Xem Thêm Sửa Xóa (CRUD) với CSDL MySQL trong PHP

Tác giả: Dương Nguyễn Phú Cường #8049
Ngày đăng: Hồi xưa đó
Lượt xem: 2355

Source code Ví dụ: https://github.com/kellyfire611/learning.nentang.vn/tree/master/php/simple

Step 1: khởi tạo Database

Cách 1: tự restore MySQL database trên máy Local

Cách 2: sử dụng thông tin Kết nối đến Server MySQL minh họa

  • Server IP: 156.67.222.148
  • Username: u883604362_temp
  • Password: TempDb@#123
  • Database: u883604362_temp

Step 2: tạo cấu trúc thư mục

Vào ổ đĩa cài đặt XAMPP, thường là: C:\xampp\htdocs, khởi tạo thư mục dự án như sau:
C:\xampp
   ---htdocs
      ---duan                      <- Thư mục Gốc dự án
         ---index.php              <- Trang chủ dự án
         ---dbconnect.php          <- File quản lý thông tin kết nối đến MySQL Server
         ---crud_shop_suppliers    <- Folder theo từng chức năng
            ---index.php              Danh sách
            ---create.php             Thêm mới
            ---edit.php               Sửa
            ---delete.php             Xóa

Step 3: tạo file quản lý việc Kết nối MySQL trong PHP

Trong PHP, chúng ta sử dụng hàm mysqli_connect() để khởi tạo kết nối đến MySQL Server. Tạo file dbconnect.php, nội dung file
<?php
// Tạo kết nối
// Tham số của hàm mysqli_connect(hostname/ip, username, password, database_name)
// 1. hostname/ip: tên host hoặc IP database server
// - ví dụ: '127.0.0.1' tương đương 'localhost': là địa chỉ máy cục bộ
//   port mặc định khi sử dụng MySQL là 3306
//   nếu sử dụng port khác, ví dụ 3307 thì giá trị truyền vào là '127.0.0.1:3307'
// 2. username: tên tài khoản được phép truy cập vào database server
// 3. password: mật khẩu tài khoản được phép truy cập vào database server
// 4. database_name: tên database bạn muốn truy cập đến
$conn = mysqli_connect('156.67.222.148', 'u883604362_temp', 'TempDb@#123', 'u883604362_temp') or die('Xin lỗi, database không kết nối được.');

// Tùy chỉnh kết nối
// Set charset là utf-8 đối với kết nối này. Dùng để gõ tiếng Việt, Nhật, Thái, Trung Quốc ...
// Lưu ý: gõ với bộ gõ UNIKEY, bảng mã là UNICODE
$conn->query("SET NAMES 'utf8mb4'"); 
$conn->query("SET CHARACTER SET utf8mb4");  
$conn->query("SET SESSION collation_connection = 'utf8mb4_unicode_ci'");

Step 4: tạo giao diện cho Trang chủ

Để giao diện được đẹp, chúng ta sẽ sử dụng các Framework về Frontend như sau:
  1. Bootstrap 4: https://getbootstrap.com/
  2. FontAwesome 5 icons: https://fontawesome.com/
Tạo file index.php, nội dung file
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shop bán hàng NetaShop</title>

    <!-- Liên kết CSS Bootstrap bằng CDN -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>

<body>

    <div class="container">
        <div class="jumbotron">
            <h1 class="display-4">Hello, PHP!</h1>
            <p class="lead">Học về Thao tác Kết nối dữ liệu với MySQL bằng PHP</p>
            <hr class="my-4">
            <p>Thao tác Kết nối và Xử lý dữ liệu với MySQL</p>
            <a class="btn btn-primary btn-lg" href="crud_shop_suppliers/index.php" role="button">Danh sách Nhà cung cấp</a>
        </div>
    </div>

    <!-- Liên kết JS Jquery bằng CDN -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

    <!-- Liên kết JS Popper bằng CDN -->
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <!-- Liên kết JS Bootstrap bằng CDN -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

    <!-- Liên kết JS FontAwesome bằng CDN -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js"></script>
</body>

</html>

Step 5: Tạo chức năng Hiển thị Danh sách Nhà cung cấp

  • Tạo thư mục theo tên chức năng để tiện quản lý `crud_shop_suppliers`
    • Trong thư mục crud_shop_suppliers, tạo tiếp file index.php
    • Nội dung file:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shop bán hàng NetaShop</title>

    <!-- Liên kết CSS Bootstrap bằng CDN -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>

<body>

    <!-- Main content -->
    <div class="container">
        <h1>Danh sách Nhà cung cấp</h1>

        <?php
        // Truy vấn database để lấy danh sách
        // 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
        include_once(__DIR__ . '/../dbconnect.php');

        // 2. Chuẩn bị câu truy vấn $sql
        $sql = "select * from `shop_suppliers`";

        // 3. Thực thi câu truy vấn SQL để lấy về dữ liệu
        $result = mysqli_query($conn, $sql);

        // 4. Khi thực thi các truy vấn dạng SELECT, dữ liệu lấy về cần phải phân tách để sử dụng
        // Thông thường, chúng ta sẽ sử dụng vòng lặp while để duyệt danh sách các dòng dữ liệu được SELECT
        // Ta sẽ tạo 1 mảng array để chứa các dữ liệu được trả về
        $data = [];
        $rowNum = 1;
        while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
            $data[] = array(
                'rowNum' => $rowNum, // sử dụng biến tự tăng để làm dữ liệu cột STT
                'id' => $row['id'],
                'supplier_code' => $row['supplier_code'],
                'supplier_name' => $row['supplier_name'],
                'description' => $row['description'],
                'image' => $row['image'],
                'created_at' => $row['created_at'],
                'updated_at' => $row['updated_at'],
            );
            $rowNum++;
        }
        ?>

        <!-- Button Thêm mới -->
        <a href="create.php" class="btn btn-primary">
            <i class="fas fa-plus"></i> Thêm mới
        </a>

        <table class="table table-borderd">
            <thead>
                <tr>
                    <th>STT</th>
                    <th>Mã nhà Cung cấp</th>
                    <th>Tên nhà Cung cấp</th>
                    <th>Ghi chú</th>
                    <th>Ảnh đại diện</th>
                    <th>Ngày tạo mới</th>
                    <th>Ngày cập nhật</th>
                    <th>###</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($data as $row) : ?>
                    <tr>
                        <td><?php echo $row['rowNum']; ?></td>
                        <td><?php echo $row['supplier_code']; ?></td>
                        <td><?php echo $row['supplier_name']; ?></td>
                        <td><?php echo $row['description']; ?></td>
                        <td><?php echo $row['image']; ?></td>
                        <td><?php echo $row['created_at']; ?></td>
                        <td><?php echo $row['updated_at']; ?></td>
                        <td>
                            <!-- Button Sửa -->
                            <a href="" id="btnUpdate" class="btn btn-primary">
                                <i class="fas fa-edit"></i>
                            </a>

                            <!-- Button Xóa -->
                            <a href="" id="btnDelete" class="btn btn-danger">
                                <i class="fas fa-trash-alt"></i>
                            </a>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </div>

    <!-- Liên kết JS Jquery bằng CDN -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

    <!-- Liên kết JS Popper bằng CDN -->
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <!-- Liên kết JS Bootstrap bằng CDN -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

    <!-- Liên kết JS FontAwesome bằng CDN -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js"></script>
</body>

</html>

Step 6: tạo chức năng Thêm mới Nhà cung cấp

  • Trong thư mục crud_shop_suppliers, tạo tiếp file create.php
  • Nội dung file:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shop bán hàng NetaShop</title>

    <!-- Liên kết CSS Bootstrap bằng CDN -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>

<body>

    <!-- Main content -->
    <div class="container">
        <h1>Form Thêm mới Nhà cung cấp</h1>

        <form name="frmCreate" method="post" action="" class="form">
            <table class="table">
                <tr>
                    <td>Mã nhà cung cấp</td>
                    <td><input type="text" name="supplier_code" id="supplier_code" class="form-control" /></td>
                </tr>
                <tr>
                    <td>Tên nhà cung cấp</td>
                    <td><input type="text" name="supplier_name" id="supplier_name" class="form-control" /></td>
                </tr>
                <tr>
                    <td>Ghi chú</td>
                    <td><textarea name="description" id="description" class="form-control"></textarea></td>
                </tr>
                <tr>
                    <td>Ảnh đại diện</td>
                    <td><input type="text" name="image" id="image" class="form-control" /></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <button name="btnSave" class="btn btn-primary"><i class="fas fa-save"></i> Lưu dữ liệu</button>
                    </td>
                </tr>
            </table>
        </form>
    </div>

    <?php
    // Truy vấn database
    // 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
    include_once(__DIR__ . '/../dbconnect.php');

    // 2. Người dùng mới truy cập trang lần đầu tiên (người dùng chưa gởi dữ liệu `btnSave` - chưa nhấn nút Save) về Server
    // có nghĩa là biến $_POST['btnSave'] chưa được khởi tạo hoặc chưa có giá trị
    // => hiển thị Form nhập liệu

    // Nếu biến $_POST['btnSave'] đã được khởi tạo
    // => Người dùng đã bấm nút "Lưu dữ liệu"
    if ( isset($_POST['btnSave']) ) {
        
        // 3. Nếu người dùng có bấm nút `Lưu dữ liệu` thì thực thi câu lệnh INSERT
        // Lấy dữ liệu người dùng hiệu chỉnh gởi từ REQUEST POST
        $supplier_code = $_POST['supplier_code'];
        $supplier_name = $_POST['supplier_name'];
        $description = $_POST['description'];
        $image = $_POST['image'];
        $created_at = date('Y-m-d H:i:s'); // Lấy ngày giờ hiện tại theo định dạng `Năm-Tháng-Ngày Giờ-Phút-Giây`. Vd: 2020-02-18 09:12:12
        $updated_at = NULL;

        // 4. Kiểm tra ràng buộc dữ liệu (Validation)
        // Tạo biến lỗi để chứa thông báo lỗi
        $errors = [];

        // --- Kiểm tra Mã nhà cung cấp (validate)
        // required (bắt buộc nhập <=> không được rỗng)
        if (empty($supplier_code)) {
            $errors['supplier_code'][] = [
                'rule' => 'required',
                'rule_value' => true,
                'value' => $supplier_code,
                'msg' => 'Vui lòng nhập mã Nhà cung cấp'
            ];
        }
        // minlength 3 (tối thiểu 3 ký tự)
        if (!empty($supplier_code) && strlen($supplier_code) < 3) {
            $errors['supplier_code'][] = [
                'rule' => 'minlength',
                'rule_value' => 3,
                'value' => $supplier_code,
                'msg' => 'Mã Nhà cung cấp phải có ít nhất 3 ký tự'
            ];
        }
        // maxlength 50 (tối đa 50 ký tự)
        if (!empty($supplier_code) && strlen($supplier_code) > 50) {
            $errors['supplier_code'][] = [
                'rule' => 'maxlength',
                'rule_value' => 50,
                'value' => $supplier_code,
                'msg' => 'Mã Nhà cung cấp không được vượt quá 50 ký tự'
            ];
        }

        // --- Kiểm tra Tên nhà cung cấp (validate)
        // required (bắt buộc nhập <=> không được rỗng)
        if (empty($description)) {
            $errors['description'][] = [
                'rule' => 'required',
                'rule_value' => true,
                'value' => $description,
                'msg' => 'Vui lòng nhập mô tả Loại sản phẩm'
            ];
        }
        // minlength 3 (tối thiểu 3 ký tự)
        if (!empty($description) && strlen($description) < 3) {
            $errors['description'][] = [
                'rule' => 'minlength',
                'rule_value' => 3,
                'value' => $description,
                'msg' => 'Mô tả loại sản phẩm phải có ít nhất 3 ký tự'
            ];
        }
        // maxlength 255 (tối đa 255 ký tự)
        if (!empty($description) && strlen($description) > 255) {
            $errors['description'][] = [
                'rule' => 'maxlength',
                'rule_value' => 255,
                'value' => $description,
                'msg' => 'Mô tả loại sản phẩm không được vượt quá 255 ký tự'
            ];
        }

        // 5. Thông báo lỗi cụ thể người dùng mắc phải (nếu vi phạm bất kỳ quy luật kiểm tra ràng buộc)
        // dd($errors);
        if (!empty($errors)) {
            // In ra thông báo lỗi
            // kèm theo dữ liệu thông báo lỗi
            foreach($errors as $errorField) {
                foreach($errorField as $error) {
                    echo $error['msg'] . '<br />';
                }
            }
            return;
        }

        // 6. Nếu không có lỗi dữ liệu sẽ thực thi câu lệnh SQL
        // Câu lệnh INSERT
        $sqlInsert = <<<EOT
        INSERT INTO shop_suppliers (supplier_code, supplier_name, description, image, created_at, updated_at) 
        VALUES ('$supplier_code', '$supplier_name', '$description', '$image', '$created_at', '$updated_at')
EOT;

        // Code dùng cho DEBUG
        // var_dump($sqlInsert); die;

        // Thực thi INSERT
        mysqli_query($conn, $sqlInsert);

        // Đóng kết nối
        mysqli_close($conn);

        // Sau khi cập nhật dữ liệu, tự động điều hướng về trang Danh sách
        header('location:index.php');   
    }
    ?>

    <!-- Liên kết JS Jquery bằng CDN -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

    <!-- Liên kết JS Popper bằng CDN -->
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <!-- Liên kết JS Bootstrap bằng CDN -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

    <!-- Liên kết JS FontAwesome bằng CDN -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js"></script>
</body>

</html>

Step 7: tạo chức năng Cập nhật Nhà cung cấp

  • Trong thư mục crud_shop_suppliers, tạo tiếp file edit.php
  • Nội dung file:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shop bán hàng NetaShop</title>

    <!-- Liên kết CSS Bootstrap bằng CDN -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
</head>

<body>

    <?php
    // Truy vấn database
    // 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
    include_once(__DIR__ . '/../dbconnect.php');

    // 2. Chuẩn bị câu truy vấn $sqlSelect, lấy dữ liệu ban đầu của record cần update
    // Lấy giá trị khóa chính được truyền theo dạng QueryString Parameter key1=value1&key2=value2...
    $id = $_GET['id'];
    $sqlSelect = "SELECT * FROM `shop_suppliers` WHERE id=$id;";

    // 3. Thực thi câu truy vấn SQL để lấy về dữ liệu ban đầu của record cần update
    $resultSelect = mysqli_query($conn, $sqlSelect);
    $shop_suppliersRow = mysqli_fetch_array($resultSelect, MYSQLI_ASSOC); // 1 record

    // Nếu không tìm thấy dữ liệu -> thông báo lỗi
    if(empty($shop_suppliersRow)) {
        echo "Giá trị id: $id không tồn tại. Vui lòng kiểm tra lại.";
        die;
    }
    ?>
    
    <!-- Main content -->
    <div class="container">
        <h1>Form Cập nhật Nhà cung cấp</h1>

        <form name="frmEdit" id="frmEdit" method="post" action="" class="form">
            <table class="table">
                <tr>
                    <td>ID</td>
                    <td><input type="text" name="id" id="id" class="form-control" value="<?php echo $shop_suppliersRow['id'] ?>" readonly /></td>
                </tr>
                <tr>
                    <td>Mã nhà cung cấp</td>
                    <td><input type="text" name="supplier_code" id="supplier_code" class="form-control" value="<?php echo $shop_suppliersRow['supplier_code'] ?>" /></td>
                </tr>
                <tr>
                    <td>Tên nhà cung cấp</td>
                    <td><input type="text" name="supplier_name" id="supplier_name" class="form-control" value="<?php echo $shop_suppliersRow['supplier_name'] ?>"  /></td>
                </tr>
                <tr>
                    <td>Ghi chú</td>
                    <td><textarea name="description" id="description" class="form-control" value="<?php echo $shop_suppliersRow['description'] ?>" ></textarea></td>
                </tr>
                <tr>
                    <td>Ảnh đại diện</td>
                    <td><input type="text" name="image" id="image" class="form-control" value="<?php echo $shop_suppliersRow['image'] ?>" /></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <button name="btnSave" class="btn btn-primary"><i class="fas fa-save"></i> Lưu dữ liệu</button>
                    </td>
                </tr>
            </table>
        </form>
    </div>


    <?php
    // 4. Nếu người dùng có bấm nút Đăng ký thì thực thi câu lệnh UPDATE
    if (isset($_POST['btnSave'])) {
        // Lấy dữ liệu người dùng hiệu chỉnh gởi từ REQUEST POST
        $supplier_code = $_POST['supplier_code'];
        $supplier_name = $_POST['supplier_name'];
        $description = $_POST['description'];
        $image = $_POST['image'];
        $updated_at = date('Y-m-d H:i:s'); // Lấy ngày giờ hiện tại theo định dạng `Năm-Tháng-Ngày Giờ-Phút-Giây`. Vd: 2020-02-18 09:12:12

        // Câu lệnh UPDATE
        $sql = "UPDATE shop_suppliers SET supplier_code='$supplier_code', supplier_name='$supplier_name', description='$description', image='$image', updated_at='$updated_at' WHERE id=$id;";

        // Thực thi UPDATE
        mysqli_query($conn, $sql);

        // Đóng kết nối
        mysqli_close($conn);

        // Sau khi cập nhật dữ liệu, tự động điều hướng về trang Danh sách
        header('location:index.php');
    }
    ?>

    <!-- Liên kết JS Jquery bằng CDN -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

    <!-- Liên kết JS Popper bằng CDN -->
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <!-- Liên kết JS Bootstrap bằng CDN -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

    <!-- Liên kết JS FontAwesome bằng CDN -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js"></script>
</body>

</html>

Step 8: tạo chức năng Xóa Nhà cung cấp

  • Trong thư mục crud_shop_suppliers, tạo tiếp file delete.php
  • Nội dung file:
<?php
// Truy vấn database
// 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
include_once(__DIR__ . '/../dbconnect.php');

// 2. Chuẩn bị câu truy vấn $sqlSelect, lấy dữ liệu ban đầu của record cần update
// Lấy giá trị khóa chính được truyền theo dạng QueryString Parameter key1=value1&key2=value2...
$id = $_GET['id'];
$sql = "DELETE FROM `shop_suppliers` WHERE id=$id;";

// 3. Thực thi câu lệnh DELETE
$result = mysqli_query($conn, $sql);

// 4. Đóng kết nối
mysqli_close($conn);

// Sau khi cập nhật dữ liệu, tự động điều hướng về trang Danh sách
header('location:index.php');

Step 9: tạo button Edit và Delete cho từng dòng trong trang Danh sách

  • Hiệu chỉnh file index.php
  • Tìm đoạn code foreach để in ra từng dòng
<!-- Main content -->
<div class="container">
    <h1>Danh sách Nhà cung cấp</h1>

    ...
    <table class="table table-borderd">
        <thead>
            <tr>
                <th>STT</th>
                <th>Mã nhà Cung cấp</th>
                <th>Tên nhà Cung cấp</th>
                <th>Ghi chú</th>
                <th>Ảnh đại diện</th>
                <th>Ngày tạo mới</th>
                <th>Ngày cập nhật</th>
                <th>###</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($data as $row) : ?>
                <tr>
                    <td><?php echo $row['rowNum']; ?></td>
                    <td><?php echo $row['supplier_code']; ?></td>
                    <td><?php echo $row['supplier_name']; ?></td>
                    <td><?php echo $row['description']; ?></td>
                    <td><?php echo $row['image']; ?></td>
                    <td><?php echo $row['created_at']; ?></td>
                    <td><?php echo $row['updated_at']; ?></td>
                    <td>
                        <!-- Button Sửa -->
                        <a href="edit.php?id=<?php echo $row['id']; ?>" id="btnUpdate" class="btn btn-primary">
                            <i class="fas fa-edit"></i>
                        </a>

                        <!-- Button Xóa -->
                        <a href="delete.php?id=<?php echo $row['id']; ?>" id="btnDelete" class="btn btn-danger">
                            <i class="fas fa-trash-alt"></i>
                        </a>
                    </td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
</div>
 

Bài tập

Thực hiện các chức năng "Danh sách" và "Thêm mới" tương tự cho các danh mục còn lại:
  • shop_categories
  • shop_products
  • shop_customers

Chương trình học


  1. Bức tranh tổng thể về Lập trình WEB 1
    1. Sơ đồ vận hành của một Website #1311
  2. Cài đặt môi trường Lập trình PHP 1
    1. Các chương trình cần thiết để Lập trình Web #8136
  3. PHP căn bản 6
    1. PHP là gì? Viết chương trình PHP đầu tiên #1237
    2. Các kiểu dữ liệu (data types), biến (variables), hằng số (constant), toán tử (operators) trong ngôn ngữ lập trình PHP #1242
    3. Bài tập Kiểm tra cú pháp PHP #1285
    4. Trình diễn (render) dữ liệu Đơn giản ra giao diện (HTML, CSS, JS) sử dụng PHP #8696
    5. Trình diễn (render) dữ liệu Danh sách Array ra giao diện (HTML, CSS, JS) sử dụng PHP #9564
    6. Bài tập trình diện (render) tổng hợp: hiển thị mẫu in Hóa đơn bán hàng Nền tảng #11773
  4. Cấu trúc điều khiển trong PHP
  5. PHP Nâng cao 7
    1. Cookie trong PHP #8071
    2. Session trong PHP #8070
    3. Session và Cookie trong PHP #8073
    4. Phân tách cấu trúc URL với PHP #8778
    5. API là gì? Web API là gì? #8835
    6. AJAX là gì? Kỹ thuật sử dụng AJAX với JQUERY #8846
    7. Xử lý (đọc - ghi) file trong PHP #11799
  6. Bài tập thực hành 3
    1. Xem Thêm Sửa Xóa (CRUD) với CSDL MySQL trong PHP #8049
    2. Bài tập thiết kế OOP trong PHP #10169
    3. Tạo trang hiển thị kết quả thi kết thúc môn WEB #11793
  7. Thực hiện Dự án PHP thực tế mẫu - sử dụng PHP thuần 3
    1. Sơ đồ vận hành của trang Web sử dụng PHP #7888
    2. Khởi tạo cấu trúc thư mục dự án PHP #1358
    3. Tích hợp Composer vào dự án PHP #8138
  8. Thu thập và Xử lý dữ liệu từ Client đến Server trong PHP 3
    1. Thu thập và Xử lý dữ liệu bằng Yêu cầu GET (Request GET) trong PHP #8704
    2. Thu thập và Xử lý dữ liệu bằng Yêu cầu POST (Request POST) trong PHP #8705
    3. Bài tập tạo Form Tìm kiếm Thu thập và Xử lý dữ liệu bằng Yêu cầu GET (Request GET) trong PHP #8717
  9. Thao tác với Cơ sở dữ liệu MySQL 9
    1. Quy trình (workflow) xử lý thao tác với cơ sở dữ liệu MySQL trong PHP #9623
    2. Tạo kết nối đến CSDL MySQL trong PHP #8116
    3. Thực thi câu lệnh INSERT trong PHP #8118
    4. Thực thi câu lệnh UPDATE trong PHP #8120
    5. Thực thi câu lệnh DELETE trong PHP #8122
    6. Thực thi câu lệnh SELECT trong PHP #8124
    7. Thực thi câu lệnh INSERT với FORM trong PHP #8126
    8. Thực thi câu lệnh DELETE với FORM trong PHP #8130
    9. Thực thi câu lệnh UPDATE với FORM trong PHP #8133
  10. Dự án thực tế mẫu (PHP thuần) - Trang web bán hàng trực tuyến - Thiết kế Backend 17
    1. Khái niệm về bố cục (layouts) trong thiết kế giao diện Web / App #10538
    2. Thiết kế bố cục (layouts) cho giao diện Backend sử dụng PHP thuần #8740
    3. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Index #8748
    4. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Create #9291
    5. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Delete #9293
    6. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Edit #9292
    7. Ràng buộc dữ liệu (validation) #8761
    8. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục cho Liên kết Khóa ngoại #8781
    9. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) upload hình Sản phẩm (upload đơn, mỗi lần 1 file) #8799
    10. Tạo trang Đăng nhập trong Backend #8823
    11. Tạo trang Đăng xuất trong Backend #8826
    12. Tạo Web API lấy dữ liệu báo cáo thống kê #8834
    13. Tạo trang Bảng tin (Dashboard) #8758
    14. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - Index #8856
    15. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - In ấn Print #8858
    16. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - Xóa Delete #8862
    17. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - Thêm mới Create #8861
  11. Dự án thực tế mẫu (PHP thuần) - Trang web bán hàng trực tuyến - Thiết kế Frontend 7
    1. Thiết kế bố cục (layouts) cho giao diện Frontend sử dụng PHP thuần #8868
    2. Thực hiện Trang chủ Frontend #8873
    3. Thực hiện Trang Giới thiệu About #8876
    4. Thực hiện Trang Liên hệ Contact (Có gởi mail Thông báo) #8879
    5. Thực hiện Trang Chi tiết Sản phẩm Product Detail #8944
    6. Thực hiện Trang Giỏ hàng Cart #8978
    7. Thực hiện Trang Thanh toán #9049
  12. Bảo mật Trang web PHP 2
    1. Cách hacker tấn công vào Hệ thống bằng cách sử dụng SQL Injection và Cách phòng chống của Quản trị Trang web #9063
    2. Cách hacker chèn các đoạn mã độc vào Hệ thống bằng cách sử dụng XSS (Cross site scripting) và Cách phòng chống của Quản trị Trang web #9067
  13. Tài liệu Tham khảo 11
    1. Tài liệu Tham khảo #7933
    2. Cách export (dump) cơ sở dữ liệu MySQL bằng HeidiSQL #8343
    3. Đệ quy đa cấp trong PHP #8495
    4. Tạo bố cục (layout) trang web sử dụng INCLUDE REQUIRE trong PHP #8523
    5. Bài tập tổng hợp - Tạo trang web đọc Truyện Tranh và Tiểu Thuyết Online #9006
    6. Cách triển khai Web lên Hosting free ByetHost #9052
    7. Nguyên nhân và cách xử lý lỗi Warning: Cannot modify header information - headers already sent by #9917
    8. Cách triển khai Web lên Hosting free 000WebHost #9959
    9. Cách tích hợp chứng thực tài khoản bằng Google vào trang web #9973
    10. Source code Tham khảo Learning.NenTang.vn #10394
    11. Database mẫu ví dụ Bán hàng Salomon #11808
  14. Nộp đồ án 1
    1. Hướng dẫn nộp đồ án Khóa Thiết kế Web PHP + MySQL #9224
  15. Thao tác với cơ sở dữ liệu MySQL bằng kỹ thuật AJAX 8
    1. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Index #9777
    2. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Create #9781
    3. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Edit #9783
    4. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Delete #9784
    5. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Index #9773
    6. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Create #9774
    7. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Edit #9775
    8. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Delete #9776
  16. Video Live Stream 1
    1. Thiết kế Web Backend PHP & MySQL - Buổi 1 #9964
  17. Lập trình hướng đối tượng OOP (Object Oriented Programming) trong PHP 1
    1. Khái niệm lập trình hướng đối tượng OOP (Object Oriented Programming) trong PHP #11801
Các bài học

Chương trình học

Bao gồm Module, Chương, Bài học, Bài tập, Kiểm tra...

Chương trình học


  1. Bức tranh tổng thể về Lập trình WEB 1
    1. Sơ đồ vận hành của một Website #1311
  2. Cài đặt môi trường Lập trình PHP 1
    1. Các chương trình cần thiết để Lập trình Web #8136
  3. PHP căn bản 6
    1. PHP là gì? Viết chương trình PHP đầu tiên #1237
    2. Các kiểu dữ liệu (data types), biến (variables), hằng số (constant), toán tử (operators) trong ngôn ngữ lập trình PHP #1242
    3. Bài tập Kiểm tra cú pháp PHP #1285
    4. Trình diễn (render) dữ liệu Đơn giản ra giao diện (HTML, CSS, JS) sử dụng PHP #8696
    5. Trình diễn (render) dữ liệu Danh sách Array ra giao diện (HTML, CSS, JS) sử dụng PHP #9564
    6. Bài tập trình diện (render) tổng hợp: hiển thị mẫu in Hóa đơn bán hàng Nền tảng #11773
  4. Cấu trúc điều khiển trong PHP
  5. PHP Nâng cao 7
    1. Cookie trong PHP #8071
    2. Session trong PHP #8070
    3. Session và Cookie trong PHP #8073
    4. Phân tách cấu trúc URL với PHP #8778
    5. API là gì? Web API là gì? #8835
    6. AJAX là gì? Kỹ thuật sử dụng AJAX với JQUERY #8846
    7. Xử lý (đọc - ghi) file trong PHP #11799
  6. Bài tập thực hành 3
    1. Xem Thêm Sửa Xóa (CRUD) với CSDL MySQL trong PHP #8049
    2. Bài tập thiết kế OOP trong PHP #10169
    3. Tạo trang hiển thị kết quả thi kết thúc môn WEB #11793
  7. Thực hiện Dự án PHP thực tế mẫu - sử dụng PHP thuần 3
    1. Sơ đồ vận hành của trang Web sử dụng PHP #7888
    2. Khởi tạo cấu trúc thư mục dự án PHP #1358
    3. Tích hợp Composer vào dự án PHP #8138
  8. Thu thập và Xử lý dữ liệu từ Client đến Server trong PHP 3
    1. Thu thập và Xử lý dữ liệu bằng Yêu cầu GET (Request GET) trong PHP #8704
    2. Thu thập và Xử lý dữ liệu bằng Yêu cầu POST (Request POST) trong PHP #8705
    3. Bài tập tạo Form Tìm kiếm Thu thập và Xử lý dữ liệu bằng Yêu cầu GET (Request GET) trong PHP #8717
  9. Thao tác với Cơ sở dữ liệu MySQL 9
    1. Quy trình (workflow) xử lý thao tác với cơ sở dữ liệu MySQL trong PHP #9623
    2. Tạo kết nối đến CSDL MySQL trong PHP #8116
    3. Thực thi câu lệnh INSERT trong PHP #8118
    4. Thực thi câu lệnh UPDATE trong PHP #8120
    5. Thực thi câu lệnh DELETE trong PHP #8122
    6. Thực thi câu lệnh SELECT trong PHP #8124
    7. Thực thi câu lệnh INSERT với FORM trong PHP #8126
    8. Thực thi câu lệnh DELETE với FORM trong PHP #8130
    9. Thực thi câu lệnh UPDATE với FORM trong PHP #8133
  10. Dự án thực tế mẫu (PHP thuần) - Trang web bán hàng trực tuyến - Thiết kế Backend 17
    1. Khái niệm về bố cục (layouts) trong thiết kế giao diện Web / App #10538
    2. Thiết kế bố cục (layouts) cho giao diện Backend sử dụng PHP thuần #8740
    3. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Index #8748
    4. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Create #9291
    5. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Delete #9293
    6. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục Phẳng - Edit #9292
    7. Ràng buộc dữ liệu (validation) #8761
    8. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) cho danh mục cho Liên kết Khóa ngoại #8781
    9. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) upload hình Sản phẩm (upload đơn, mỗi lần 1 file) #8799
    10. Tạo trang Đăng nhập trong Backend #8823
    11. Tạo trang Đăng xuất trong Backend #8826
    12. Tạo Web API lấy dữ liệu báo cáo thống kê #8834
    13. Tạo trang Bảng tin (Dashboard) #8758
    14. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - Index #8856
    15. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - In ấn Print #8858
    16. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - Xóa Delete #8862
    17. Tạo chức năng Quản lý Đơn hàng dạng Master Detail (lưu một dòng cha và nhiều dòng con) - Thêm mới Create #8861
  11. Dự án thực tế mẫu (PHP thuần) - Trang web bán hàng trực tuyến - Thiết kế Frontend 7
    1. Thiết kế bố cục (layouts) cho giao diện Frontend sử dụng PHP thuần #8868
    2. Thực hiện Trang chủ Frontend #8873
    3. Thực hiện Trang Giới thiệu About #8876
    4. Thực hiện Trang Liên hệ Contact (Có gởi mail Thông báo) #8879
    5. Thực hiện Trang Chi tiết Sản phẩm Product Detail #8944
    6. Thực hiện Trang Giỏ hàng Cart #8978
    7. Thực hiện Trang Thanh toán #9049
  12. Bảo mật Trang web PHP 2
    1. Cách hacker tấn công vào Hệ thống bằng cách sử dụng SQL Injection và Cách phòng chống của Quản trị Trang web #9063
    2. Cách hacker chèn các đoạn mã độc vào Hệ thống bằng cách sử dụng XSS (Cross site scripting) và Cách phòng chống của Quản trị Trang web #9067
  13. Tài liệu Tham khảo 11
    1. Tài liệu Tham khảo #7933
    2. Cách export (dump) cơ sở dữ liệu MySQL bằng HeidiSQL #8343
    3. Đệ quy đa cấp trong PHP #8495
    4. Tạo bố cục (layout) trang web sử dụng INCLUDE REQUIRE trong PHP #8523
    5. Bài tập tổng hợp - Tạo trang web đọc Truyện Tranh và Tiểu Thuyết Online #9006
    6. Cách triển khai Web lên Hosting free ByetHost #9052
    7. Nguyên nhân và cách xử lý lỗi Warning: Cannot modify header information - headers already sent by #9917
    8. Cách triển khai Web lên Hosting free 000WebHost #9959
    9. Cách tích hợp chứng thực tài khoản bằng Google vào trang web #9973
    10. Source code Tham khảo Learning.NenTang.vn #10394
    11. Database mẫu ví dụ Bán hàng Salomon #11808
  14. Nộp đồ án 1
    1. Hướng dẫn nộp đồ án Khóa Thiết kế Web PHP + MySQL #9224
  15. Thao tác với cơ sở dữ liệu MySQL bằng kỹ thuật AJAX 8
    1. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Index #9777
    2. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Create #9781
    3. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Edit #9783
    4. Tạo API cho chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Delete #9784
    5. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Index #9773
    6. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Create #9774
    7. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Edit #9775
    8. Tạo chức năng CRUD (Xem-Read, Thêm-Create, Sửa-Edit, Xóa-Delete) bằng kỹ thuật AJAX cho danh mục Phẳng - Delete #9776
  16. Video Live Stream 1
    1. Thiết kế Web Backend PHP & MySQL - Buổi 1 #9964
  17. Lập trình hướng đối tượng OOP (Object Oriented Programming) trong PHP 1
    1. Khái niệm lập trình hướng đối tượng OOP (Object Oriented Programming) trong PHP #11801

Bài học trước Bài học tiếp theo