Tìm hiểu về CURD trong PHP thông qua ứng dụng quản lí cầu thủ.
CURD trong là gì ? CURD thực ra là một thuật ngữ ...
CURD trong là gì ? CURD thực ra là một thuật ngữ của dân lập trình, nó là viết tắt của "Create, Read, Update, Delete" hay cụ thể là các thao tác đối với dữ liệu trong database.
Trong bài viết này mình sẽ cùng các bạn tìm hiểu về CURD thông qua quá trình xây dựng ứng quản lý cầu thủ. Ứng dụng này mình sẽ làm đơn giản thôi để các bạn newbie cũng có thể hiểu được, chức năng chính sẽ là thêm, sửa, xóa, hiển thị thông tin cầu thủ và mình sẽ xây dựng bằng PHP thuần để các bạn nắm rõ về CURD.
Trong ứng dụng này mình sẽ sử dụng phần mềm Xampp để tạo server ảo.
Lan man như vậy đủ rồi, giờ mình tiến hành luôn nhé :D.
Tạo cơ sở dữ liệu
Tất nhiên rồi, vì chúng ta thao tác với cơ sở dữ liệu mà.
Các bạn truy cập vào http://localhost/phpmyadmin tạo database với tên là demo, sau đó tạo bảng players với đoạn SQL sau:
CREATE TABLE `players` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, `national` varchar(55) NOT NULL, `position` varchar(55) NOT NULL, `salary` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Đây là kết quả sau khi đã tạo được database:
Mình cũng chuẩn bị sẵn một số dữ liệu để tiện thao tác, các bạn sử dụng đoạn SQL sau để tạo dữ liệu:
INSERT INTO `players` (`id`, `name`, `age`, `national`, `position`, `salary`) VALUES ('1', 'Lionel Messi', '30', 'Argentina', 'CF', '300000'); INSERT INTO `players` (`id`, `name`, `age`, `national`, `position`, `salary`) VALUES ('2', 'Cristiano Ronaldo', '33', 'Portugal', 'CF', '350000'); INSERT INTO `players` (`id`, `name`, `age`, `national`, `position`, `salary`) VALUES ('3', 'Xavi', '35', 'Spain', 'AMF', '220000');
Thông tin không chính xác thì các bạn thông cảm nhé!
Và đây là kết quả:
Như vậy là xong bước tạo cơ sở dữ liệu, chúng ta đến với bước tiếp theo nhé.
Tạo file giao diện cho ứng dụng
Các bạn tạo file index.php với nội dung sau:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style type="text/css"> table{ awidth: 800px; margin: auto; text-align: center; } tr { border: 1px solid; } th { border: 1px solid; } td { border: 1px solid; } h1{ text-align: center; color: red; } #button{ margin: 2px; margin-right: 10px; float: right; } </style> </head> <body> <table id="datatable" style="border: 1px solid"> <h1>Quản lý cầu thủ</h1> <thead> <tr role="row"> <th>ID</th> <th>Tên cầu thủ</th> <th>Tuổi</th> <th>Quốc tịch</th> <th>Vị trí</th> <th>Lương</th> <th style="awidth: 7%;">Edit</th> <th style="awidth: 10%;">>Delete</th> </tr> </thead> <tbody> <tr role="row"> <td>1</td> <td>Lionel Messi</td> <td>30</td> <td>Argentina</td> <td>Tiền Đạo</td> <td>230000 $</td> <td><a href="#">Edit</a></td> <td><a href="#"> Delete</a></td> </tr> </tbody> <tfoot> <tr> <td colspan="8"> <a href="add.php"><button id="button">Thêm cầu thủ</button></a> </td> </tr> </tfoot> </table> </body> </html>
Chỉ là code HTML và CSS đơn giản nên mình sẽ không giải thích nhiều nữa.
Đây là kết quả khi chạy file index.php:
Lấy và hiển thị dữ liệu từ database
Trong bước này chúng ta sẽ tiến hành kết nối tới cơ sở dữ liệu, sau đó sử dụng các hàm sử lý mysqli để lấy dữ liệu, bước này cũng chính là Read hay chữ R trong CURD. Các bạn có thể xem các hàm mysqli ở đây.
các bạn dán đoạn code dưới đây vào sau thẻ body:
<?php //Kết nối databse $con = mysqli_connect('localhost', 'root', ', 'demo'); //Viết câu SQL lấy tất cả dữ liệu trong bảng players $sql="SELECT * FROM `players` ORDER BY `id`"; //Chạy câu SQL $result=mysqli_query($con,$sql); //Gắn dữ liệu lấy được vào mảng $data while ($row=mysqli_fetch_assoc($result)) { $data[] = $row; } ?>
Mình đã giải thích rất kỹ bằng ghi chú nên mình sẽ không giải thích gì thêm.
Như vậy ta đã có mảng $data chứa các dữ liệu được lấy về từ database.
Tiếp theo ta sẽ đổ dữ liệu lấy được vào bảng mà mình đã tạo ở bước 1 nhé.
Các bạn dán tiếp đoạn code sau vào trong tag <?php ?> :
$html = '; foreach ($data as $value) { $html .= ' <tr role="row"> <td>'.$value['id'].'</td> <td>'.$value['name'].'</td> <td>'.$value['age'].'</td> <td>'.$value['national'].'</td> <td>'.$value['position'].'</td> <td>'.$value['salary'].' $</td> <td><a href="edit.php?id='.$value['id'].'">Edit</a></td> <td><a href="delete.php?id='.$value['id'].'"> Delete</a></td> </tr>'; }
Trong đoạn code trên mình tạo một biến $html để ghi nội dung html, sau đó lặp qua mảng $data và gắn dữ liệu vào trong biến $html. Các bạn để ý là mình sử dụng .= để nối chuỗi như vậy cứ mỗi lần lặp qua 1 cầu thủ trong danh sách thì sẽ có thêm một thẻ <tr> được nối vào $html.
Ở đây có một điểm cần lưu ý là mình đã gắn link cho hai ô edit và delete để thực hiện các chức năng sửa và xóa. Tạm thời các bạn không cần quan tâm đến nó, mình sẽ giải thích kỹ hơn ở những phần sau.
OK vậy là đã có biến $html chứa code html rồi giờ in nó ra bên trong thẻ <tbody> của bảng nhé.
<tbody> <?php echo $html; ?> </tbody>
Vậy là xong bước hiển thị dữ liệu từ database rồi, đây là kết quả:
Chức năng thêm cầu thủ
Đầu tiên chúng ta cần tạo một file để hiển thị form nhập thông tin cầu thủ, các bạn tạo file add.php và dán đoạn code sau vào nhé:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style type="text/css"> button{ margin-right: 20px; padding: 5px; } form{ awidth: 600px; margin: auto; text-align: center; } div.form-group{ awidth: 90%; height: 24px; margin: 5px; } div.form-group input{ float: right; height: 20px; awidth: 400px; } span{ font: 18px bold; font-weight: bold; float: right; margin-right: 10px; } h1{ text-align: center; } </style> </head> <body> <form action="process.php" method="POST"> <h1>Thêm Cầu Thủ</h1> <div class="form-group"> <input type="text" name="name"><span>Tên cầu thủ: </span> </div> <div class="form-group"> <input type="text" name="age"><span>Tuổi: </span> </div> <div class="form-group"> <input type="text" name="national"><span>Quốc tịch: </span> </div> <div class="form-group"> <input type="text" name="position"><span>Vị trí: </span> </div> <div class="form-group"> <input type="text" name="salary"><span>Lương: </span> </div> <div class="form-group"> <button type="submit">Thêm</button> <button type="reset">Reset</button> <a href="index.php"><button type="button">Cancle</button></a> </div> </form> </body> </html>
Các bạn để ý sẽ thấy method="process.php" vậy mình sẽ tạo tiếp một file process.php để xử lý thông tin được người dùng nhập và gửi đi.
Các bạn dán đoạn code sau vào file process.php vừa tạo:
<?php $data = $_POST; $errors = []; //Validate name if (!is_string($data['name']) || strlen($data['name']) < 5 || strlen($data['name']) > 55) { $errors['name'] = $data['name'] . "Tên cầu thủ không hợp lệ!"; } //Validate age if (!is_numeric($data['age']) || $data['age'] < 0 || $data['age'] > 150) { $errors['age'] = "Tuổi không hợp lệ!"; } //Validate national if (!is_string($data['national']) || strlen($data['national']) < 2 || strlen($data['national']) > 55) { $errors['national'] = "Quốc tịch không hợp lệ!"; } //Validate position if (!is_string($data['position']) || strlen($data['position']) < 2 || strlen($data['position']) > 10) { $errors['position'] = "Vị trí không hợp lệ!"; } //Validate salary if (!is_numeric($data['salary']) || $data['salary'] < 0 || $data['salary'] > 1000000) { $errors['salary'] = "Lương không hợp lệ!"; } if (count($errors) > 0) { $err_str = '<ul>'; foreach ($errors as $err) { $err_str .= '<li>'.$err.'</li>'; } $err_str .= '</ul>'; echo $err_str; }else{ //Kết nối databse $con = mysqli_connect('localhost', 'root', ', 'demo'); //Viết câu SQL lấy tất cả dữ liệu trong bảng players $sql = "INSERT INTO `players` (`name`, `age`, `national`, `position`, `salary`) VALUES ('".$data['name']."', '".$data['age']."', '".$data['national']."', '".$data['position']."', '".$data['salary']."');"; //Chạy câu SQL if ($result = mysqli_query($con,$sql)) { echo "<h1>Thêm mới cầu thủ thành công Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; }else{ echo "<h1>Có lỗi xảy ra Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; } } ?>
Đầu tiên là mình sẽ gán dữ liệu trong biến $_POST vào biến $data.
Tiếp đến là tạo bến $errors để lưu các lỗi.
Tiếp theo mình sẽ validate các giá trị được người dùng gửi lên, ở đây các điều kiện khá đơn giản nên mình sẽ không giải thích nhiều nữa. Nếu có lỗi ở phần tử nào thì sẽ tạo phần tử đó trong mảng $errors và gán nội dung lỗi vào đó.
Sau khi đã kiểm tra tất cả các giá trị, ta tiến hành kiểm tra mảng $errors, nếu số phần tử mảng $errors lớn hơn 0 tức là đã có lỗi xảy ra và mình sẽ in nó ra.
Ngược lại, tức là không có phần tử nào trong mảng $errors và các giá trị đều hợp lệ ta tiến hành kết nối tới database và sử dụng câu lệnh INSERT để thêm mới dữ liệu, cuối cùng là hiện câu thông báo đã thêm thành công hoặc có lỗi xảy ra.
Vậy là mình đã hướng dẫn các bạn tạo xong chức năng thêm mới cầu thủ.
Chức năng sửa thông tin cầu thủ
Cúng giống với thêm cầu thủ, chức năng sửa thông tin cũng cần một file giao diện để người dùng nhập liệu, các bạn tạo file edit.php và dán nội dung dưới đây vào nhé.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style type="text/css"> button{ margin-right: 20px; padding: 5px; } form{ awidth: 600px; margin: auto; text-align: center; } div.form-group{ awidth: 90%; height: 24px; margin: 5px; } div.form-group input{ float: right; height: 20px; awidth: 400px; } span{ font: 18px bold; font-weight: bold; float: right; margin-right: 10px; } h1{ text-align: center; } </style> </head> <body> <?php $id = $_GET['id']; //Kết nối databse $con = mysqli_connect('localhost', 'root', ', 'demo'); //Viết câu SQL lấy tất cả dữ liệu trong bảng players $sql="SELECT * FROM `players` WHERE `id`= ".$id; //Chạy câu SQL $result=mysqli_query($con,$sql); //Gắn dữ liệu lấy được vào mảng $data while ($row=mysqli_fetch_assoc($result)) { $info = $row; } ?> <form action="process.php" method="POST"> <h1>Chỉnh sửa thông tin cầu thủ</h1> <div class="form-group"> <input type="text" name="name" value="<?php echo $info['name'] ?>"><span>Tên cầu thủ: </span> </div> <div class="form-group"> <input type="text" name="age" value="<?php echo $info['age'] ?>"><span>Tuổi: </span> </div> <div class="form-group"> <input type="text" name="national" value="<?php echo $info['national'] ?>"><span>Quốc tịch: </span> </div> <div class="form-group"> <input type="text" name="position" value="<?php echo $info['position'] ?>"><span>Vị trí: </span> </div> <div class="form-group"> <input type="text" name="salary" value="<?php echo $info['salary'] ?>"><span>Lương: </span> </div> <div class="form-group"> <button type="submit">Cập nhật</button> <button type="reset">Reset</button> <a href="index.php"><button type="button">Cancle</button></a> </div> </form> </body> </html>
Ở đây có 3 điểm cần lưu ý, đầu tiên là biến $_GET['id'] ở đâu mà có ? Ở bước gắn dữ liệu vào biến $html ở file index.php, mình có gắn link vào hai ô edit và delete như sau:
<td><a href="edit.php?id='.$value['id'].'">Edit</a></td> <td><a href="delete.php?id='.$value['id'].'"> Delete</a></td>
Các bạn để ý đoạn mã href="edit.php?id='.$value['id'].'" mình đã truyền luôn id của cầu thủ trên url và nó sẽ được truyền đến file edit.php thông qua biến $_GET['id'].
Từ biến $id này ta có thể sử dụng câu SQL và lấy thông tin của cầu thủ có id đó.
Thứ hai là phần action của form, mình vẫn để là process.php mà phương thức thêm cầu thủ sử dụng, sở dĩ mình sử dụng chung file này để xử lý vì phương thức chỉnh sửa cũng có các bược validate giống với thêm mới.
Cuối cùngi là khi đã có thông tin cầu thủ lưu trong biến $info, mình sẽ đổ nó ra các ô nhập liệu bằng thuộc tính value của thẻ input:
<input type="text" name="name" value="<?php echo $info['name'] ?>"><span>Tên cầu thủ: </span>
Như vậy là xong về giao diện, nó khá giống với form thêm cầu thủ nhưng chỉ khác là nó sẽ hiển thị thông tin cũ của cầu thủ để người dùng xác định xem cần sửa giá trị nào.
Và đây là kết quả sau khi click vào chỉnh sửa thông tin Messi:
Ok vậy là xong phần giao diện, giờ các bạn chỉnh sửa action của form trong file edit.php thành như sau:
action="process.php?id=<?php echo $id ?>"
Ta sẽ gửi tới file process.php một biến $id thông qua url để nó nhận ra đâu là chỉnh sửa đâu là thêm mới.
Giờ ta sẽ chỉnh sửa flle process.php để nó nhận diện đâu là thêm mới và đâu là chỉnh sửa để có những xử lý phù hợp.
Mình sẽ chỉ cần chỉnh sửa doạn code sau khi đã validate thành công, vì cả hai phương thức đều cần validate mà. Ta sẽ chú ý đến đoạn code trong khung được bôi đỏ:
Mình sẽ phân biệt giữa hai chức năng thêm và chỉnh sửa dựa vào biến $_GET['id']. Nếu tồn tại biến $_GET['id'] thì đó là chức năng sửa thông tin và ngược lại là chức năng thêm mới.
Các bạn dán đoạn mã sau thay thế cho đoạn mã được mình khoanh đỏ ở trên:
if (isset($_GET['id'])) { //Chỉnh sửa thông tin //Kết nối databse $con = mysqli_connect('localhost', 'root', ', 'demo'); //Viết câu SQL lấy tất cả dữ liệu trong bảng players $sql = "UPDATE `players` SET `name`='".$data['name']."',`age`='".$data['age']."',`national`='".$data['national']."',`position`='".$data['position']."',`salary`='".$data['salary']."' WHERE `id` = ".$_GET['id']; // Chạy câu SQL if ($result = mysqli_query($con,$sql)) { echo "<h1>Chỉnh sửa thông tin cầu thủ thành công Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; }else{ echo "<h1>Có lỗi xảy ra Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; } }else{ //Thêm mới cầu thủ //Kết nối databse $con = mysqli_connect('localhost', 'root', ', 'demo'); //Viết câu SQL lấy tất cả dữ liệu trong bảng players $sql = "INSERT INTO `players` (`name`, `age`, `national`, `position`, `salary`) VALUES ('".$data['name']."', '".$data['age']."', '".$data['national']."', '".$data['position']."', '".$data['salary']."');"; //Chạy câu SQL if ($result = mysqli_query($con,$sql)) { echo "<h1>Thêm mới cầu thủ thành công Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; }else{ echo "<h1>Có lỗi xảy ra Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; } }
Trong phần này các bạn chỉ cần lưu ý đến câu SQL UPDATE vì các bước khác đều tương tự như chức năng thêm mới.
Vậy là chúng ta đã xây dựng xong chức năng chỉnh sửa thông tin cầu thủ, cùng tiến hành bước cuối cùng nhé.
Xóa cầu thủ
Chức năng xóa cầu thủ này khá đơn giản vì chúng ta sẽ không phải xây dựng giao diện mà sẽ tiến hành xây viết code xử lý luôn.
Các bạn tạo file delete.php và dán nội dụng dưới đây vào:
<?php $id = $_GET['id']; $con = mysqli_connect('localhost', 'root', ', 'demo'); //Viết câu SQL lấy tất cả dữ liệu trong bảng players $sql = "DELETE FROM `players` WHERE `id`='".$id."'"; // Chạy câu SQL if ($result = mysqli_query($con,$sql)) { echo "<h1>Xóa cầu thủ thành công Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; }else{ echo "<h1>Có lỗi xảy ra Click vào <a href='index.php'>đây</a> để về trang danh sách</h1>"; } ?>
Khá đơn giản phải không nào, đầu tiên là lấy id của cầu thủ muốn xóa thì cũng giống với chức năng edit, ta sẽ gửi id thông qua url và nhận nó qua biến $_GET['id'].
Sau đó viết câu SQL DELETE và chạy nó tương tự như các chức năng khác. Các bạn lưu ý cấu trúc câu SQL DELETE nhé, nó đơn giản nhưng không thể thiếu trong bất cứ ứng dụng nào sử dụng MySql đâu.
Như vậy là mình đã hướng dẫn các bạn tạo xong ứng dụng quản lý cầu thủ đơn giản rồi.
Những điều cần chú ý và mẹo
Trong bài viết này các bạn cần nắm được một số ý chính sau:
- Khái niệm về CURD, thực ra cũng chẳng có gì, chỉ cần nhớ nó là viết tắt của Creat, Update, Read, Delete hay thêm, sửa, xóa, đọc dữ liệu từ database.
- Cấu trúc các câu lệnh SQL INSERT, UPDATE, DELETE, SELECT, có một mẹo là các bạn nên viết hoa các từ khóa của SQL và viết in thường các giá trị cũng như tên cột, tên bảng..., luôn đặt các giá trị chuỗi trong cặp dấu nháy đơn hoặc nháy đôi, nên đặt các tên bảng, tên cột trong cặp dấu `( dưới nút Esc).
- Gửi và nhận dữ liệu từ form thông qua hai biến $_GET và $_POST, trong bài này mình cũng hướng dẫn các bạn một mẹo nhỏ để truyền dữ liệu thông qua url.
Đó là tất cả rồi :D hi vọng các bạn đã làm chủ được CURD. Hẹn gặp lại các bạn ở các bài viết tiếp theo trên code24h.com.
Khóa học nên xem
- 20: Học lập trình Angular js/MySQL/PHP
- Xây dựng website hoàn chỉnh với Laravel PHP Framework
- Lập trình FULLSTACK với ANGULAR - PHP - MYSQL
- Lập trình Fullstack với Angular - PHP - MySQL
- Lập trình hướng đối tượng từ cơ bản đến nâng cao trong PHP
Nguồn: code24h.com