Trong bài hướng dẫn tự học PHP này, bạn sẽ tìm hiểu cách tạo một tính năng tìm kiếm trực tiếp (live search) trong cơ sở dữ liệu MySQL bằng PHP và Ajax.
Trong bài hướng dẫn tự học PHP này, bạn sẽ tìm hiểu cách tạo một tính năng tìm kiếm trực tiếp (live search) trong cơ sở dữ liệu MySQL bằng PHP và Ajax.
Tìm kiếm trực tiếp trong CSDL là gì?
Bạn có thể tạo một chức năng tìm kiếm trực tiếp trong CSDL đơn giản sử dụng Ajax và PHP.
Trong đó kết quả tìm kiếm sẽ được hiển thị khi bạn bắt đầu nhập một số ký tự trong box tìm kiếm.
Trong hướng dẫn này, chúng ta sẽ tạo một box tìm kiếm trực tiếp sẽ tìm kiếm bảng countries và hiển thị kết quả không đồng bộ.
Nhưng, trước hết chúng ta cần tạo bảng CSDL về các quốc gia đã:
Chức năng tìm kiếm trực tiếp bằng PHP và AJAX
Bước 1: Tạo bảng CSDL
Thực hiện truy vấn SQL sau để tạo bảng countries trong cơ sở dữ liệu MySQL của bạn.
CREATE TABLE countries (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL
);
Sau khi tạo bảng CSDL, bạn cần điền vào đó một số dữ liệu bằng cách sử dụng câu lệnh SQL INSERT.
Ngoài ra, bạn có thể tải xuống bảng countries đã được chuẩn bị trước bằng cách click và import nó vào cơ sở dữ liệu MySQL của bạn.
Vui lòng xem bài viết hướng dẫn về Cách tạo bảng CSDL MySQL để biết chi tiết về cú pháp tạo bảng trong hệ thống cơ sở dữ liệu MySQL.
Bước 2: Tạo Form tìm kiếm
Bây giờ, hãy tạo một giao diện web đơn giản cho phép người dùng tìm kiếm trực tiếp tên của các quốc gia có sẵn trong bảng countries của chúng ta.
Chức năng này giống như tự động hoàn thành.
Tạo một tệp PHP có tên ‘search-form.php‘ và đặt đoạn mã sau vào trong nó:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Chức năng Live Search bằng PHP và AJAX</title>
<style type="text/css">
body{
font-family: Arail, sans-serif;
}
/* CSS cho search box */
.search-box{
width: 300px;
position: relative;
display: inline-block;
font-size: 14px;
}
.search-box input[type="text"]{
height: 32px;
padding: 5px 10px;
border: 1px solid #CCCCCC;
font-size: 14px;
}
.result{
position: absolute;
z-index: 999;
top: 100%;
left: 0;
}
.search-box input[type="text"], .result{
width: 100%;
box-sizing: border-box;
}
/* CSS cho kết quả */
.result p{
margin: 0;
padding: 7px 10px;
border: 1px solid #CCCCCC;
border-top: none;
cursor: pointer;
}
.result p:hover{
background: #f2f2f2;
}
</style>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.search-box input[type="text"]').on("keyup input", function(){
/* Lấy giá trị đầu vào khi có thay đổi */
var inputVal = $(this).val();
var resultDropdown = $(this).siblings(".result");
if(inputVal.length){
$.get("backend-search.php", {term: inputVal}).done(function(data){
// Hiển thị dữ liệu trả về trong trình duyệt
resultDropdown.html(data);
});
} else{
resultDropdown.empty();
}
});
// Thiết lập giá trị đầu vào khi click vào result
$(document).on("click", ".result p", function(){
$(this).parents(".search-box").find('input[type="text"]').val($(this).text());
$(this).parent(".result").empty();
});
});
</script>
</head>
<body>
<div class="search-box">
<input type="text" autocomplete="off" placeholder="Search country..." />
<div class="result"></div>
</div>
</body>
</html>
Mỗi khi nội dung của đầu vào tìm kiếm bị thay đổi hoặc sự kiện keyup xảy ra trên đầu vào tìm kiếm, mã jQuery (dòng no-47 đến 67) đã gửi một yêu cầu Ajax đến tệp ‘backend-search.php‘ để lấy các bản ghi từ bảng countries liên quan đến chuỗi tìm kiếm.
Những bản ghi này sau đó sẽ được jQuery chèn vào một div và hiển thị trên trình duyệt.
Bước 3: Xử lý truy vấn trong Backend
Và đây là mã nguồn của tệp ‘backend-search.php‘ của chúng ta.
Nó sẽ tìm kiếm cơ sở dữ liệu dựa trên chuỗi truy vấn được gửi bởi Ajax và gửi kết quả trở lại trình duyệt.
* Phương pháp hướng thủ tục
<?php
/* Cố gắng kết nối đến MySQL server. Giả sử bạn đang chạy MySQL server mặc đinh (user là 'root' và không có mật khẩu */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
if(isset($_REQUEST["term"])){
// Chuẩn bị câu lệnh SQL SELECT
$sql = "SELECT * FROM countries WHERE name LIKE ?";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết biến đến câu lệnh đã chuẩn bị như là tham số
mysqli_stmt_bind_param($stmt, "s", $param_term);
// Thiết lập các tham số
$param_term = $_REQUEST["term"] . '%';
// Cố gắng thực thi câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
$result = mysqli_stmt_get_result($stmt);
// Kiểm tra số lượng row trong kết quả
if(mysqli_num_rows($result) > 0){
// Tìm nạp các hàng kết quả dưới dạng mảng kết hợp
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
echo "<p>" . $row["name"] . "</p>";
}
} else{
echo "<p>Không tìm thấy kết quả nào</p>";
}
} else{
echo "ERROR: Không thể thực thi câu lệnh $sql. " . mysqli_error($link);
}
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
}
// Đóng kết nối
mysqli_close($link);
?>
* Phương pháp hướng đối tượng
<?php
/* Cố gắng kết nối đến MySQL server. Giả sử bạn đang chạy MySQL server mặc đinh (user là 'root' và không có mật khẩu */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
if(isset($_REQUEST["term"])){
// Chuẩn bị câu lệnh SQL SELECT
$sql = "SELECT * FROM countries WHERE name LIKE ?";
if($stmt = $mysqli->prepare($sql)){
// Liên kết biến đến câu lệnh đã chuẩn bị như là tham số
$stmt->bind_param("s", $param_term);
// Thiết lập các tham số
$param_term = $_REQUEST["term"] . '%';
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
$result = $stmt->get_result();
// Kiểm tra số lượng row trong kết quả
if($result->num_rows > 0){
// Tìm nạp các hàng kết quả dưới dạng mảng kết hợp
while($row = $result->fetch_array(MYSQLI_ASSOC)){
echo "<p>" . $row["name"] . "</p>";
}
} else{
echo "<p>Không tìm thấy kết quả nào</p>";
}
} else{
echo "ERROR: Không thể thực thi câu lệnh $sql. " . mysqli_error($link);
}
}
// Đóng câu lệnh
$stmt->close();
}
// Đóng kết nối
$mysqli->close();
?>
* Sử dụng PDO
<?php
/* Cố gắng kết nối đến MySQL server. Giả sử bạn đang chạy MySQL server mặc đinh (user là 'root' và không có mật khẩu */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập PDO error mode thành ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
if(isset($_REQUEST["term"])){
// Chuẩn bị câu lệnh
$sql = "SELECT * FROM countries WHERE name LIKE :term";
$stmt = $pdo->prepare($sql);
$term = $_REQUEST["term"] . '%';
// Liên kết các tham số đến câu lệnh
$stmt->bindParam(":term", $term);
// Thực thi câu lệnh đã chuẩn bị
$stmt->execute();
if($stmt->rowCount() > 0){
while($row = $stmt->fetch()){
echo "<p>" . $row["name"] . "</p>";
}
} else{
echo "<p>Không tìm thấy kết quả nào</p>";
}
}
} catch(PDOException $e){
die("ERROR: Không thể thực thi câu lệnh $sql. " . $e->getMessage());
}
// Đóng câu lệnh
unset($stmt);
// Đóng kết nối
unset($pdo);
?>
Câu lệnh SQL SELECT được sử dụng kết hợp với toán tử LIKE (dòng số 16) để tìm các bản ghi khớp trong bảng cơ sở dữ liệu countries.
Chúng ta đã triển khai câu lệnh đã chuẩn bị (Prepared Statements trong PHP) để có hiệu suất tìm kiếm tốt hơn cũng như để ngăn chặn các cuộc tấn công SQL injection.
Lưu ý: Luôn lọc và xác thực đầu vào của người dùng trước khi sử dụng nó trong câu lệnh SQL. Bạn cũng có thể sử dụng hàm mysqli_real_escape_string() của PHP để loại bỏ các ký tự đặc biệt trong đầu vào của người dùng và tạo một chuỗi SQL hợp lệ để chống lại tấn công SQL injection.
Bạn đã tạo thành công chức năng live search với PHP và AJAX.
Trong bài viết này, mình đã hướng dẫn bạn tạo thành công chức năng live search bằng cách sử dụng PHP và AJAX, nó có 4 bước:
Tạo bảng CSDL
Tạo form (tạo box search) và chỗ hiển thị kết quả tìm kiếm
Xử lý truy vấn với PHP (Hướng thủ tục, hướng đối tượng, PDO
Chức năng này rất hữu ích trong website cũng như cho bạn thấy cách sử dụng PHP và AJAX.
Trong bài hướng dẫn tự học MySQL & PHP này, bạn sẽ tìm hiểu cách xây dựng ứng dụng CRUD với PHP và MySQL.
Trong bài hướng dẫn tự học MySQL & PHP này, bạn sẽ tìm hiểu cách xây dựng ứng dụng CRUD với PHP và MySQL.
CRUD là gì?
CRUD là từ viết tắt của Create, Read, Update và Delete.
Các hoạt động CRUD là các thao tác dữ liệu cơ bản.
Chúng ta đã học cách thực hiện tạo (tức là câu lệnh insert), đọc (tức là câu lệnh select), cập nhật và xóa các hoạt động trong các bài viết trước.
Trong bài này, chúng ta sẽ tạo một ứng dụng PHP đơn giản để thực hiện tất cả các hoạt động này trên bảng cơ sở dữ liệu MySQL.
Bây giờ, hãy bắt đầu bằng cách tạo bảng CSDL mà chúng ta sẽ sử dụng trong tất cả các ví dụ của chúng ta.
1. Tạo bảng CSDL
Thực hiện truy vấn SQL sau để tạo bảng có employee bên trong cơ sở dữ liệu MySQL của bạn.
Chúng ta sẽ sử dụng bảng này cho tất cả các ví dụ bên dưới.
CREATE TABLE employees (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
address VARCHAR(255) NOT NULL,
salary INT(10) NOT NULL
);
2. Tạo file config
Sau khi tạo bảng, chúng ta cần tạo một tập lệnh PHP để kết nối với máy chủ cơ sở dữ liệu MySQL. Hãy tạo một tệp có tên ‘config.php‘ và đặt đoạn mã sau vào trong nó.
Sau này chúng ta sẽ yêu cầu tệp config.php này trong các trang khác bằng cách sử dụng hàm require() của PHP.
Hướng thủ tục:
<?php
/* Thông tin CSDL. Giả sử bạn đang chạy MySQL Server với thiết lập mặc định (user 'root' và không có mật khẩu) */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'demo');
/* Cố gắng kết nối với cơ sở dữ liệu MySQL */
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
?>
Hướng đối tượng:
<?php
/* Thông tin CSDL. Giả sử bạn đang chạy MySQL Server với thiết lập mặc định (user 'root' và không có mật khẩu) */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'demo');
/* Cố gắng kết nối với cơ sở dữ liệu MySQL */
$mysqli = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
?>
PDO:
<?php
/* Thông tin CSDL. Giả sử bạn đang chạy MySQL Server với thiết lập mặc định (user 'root' và không có mật khẩu) */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'demo');
/* Cố gắng kết nối với cơ sở dữ liệu MySQL */
try{
$pdo = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USERNAME, DB_PASSWORD);
// Thiết lập chế độ PDO Error thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
?>
Lưu ý: Thay thế thông tin đăng nhập theo cài đặt máy chủ MySQL của bạn trước khi kiểm tra mã này, ví dụ: thay thế tên cơ sở dữ liệu ‘demo‘ bằng tên cơ sở dữ liệu của riêng bạn, thay thế tên người dùng ‘root’ bằng tên người dùng cơ sở dữ liệu của bạn, chỉ định mật khẩu cơ sở dữ liệu nếu có.
3. Tạo một trang Landing Page
Trước tiên, chúng ta sẽ tạo một trang đích cho ứng dụng CRUD của chúng ta có bảng dữ liệu hiển thị các bản ghi từ bảng cơ sở dữ liệu employee.
Nó cũng có các biểu tượng hành động cho mỗi bản ghi được hiển thị trong bảng, mà bạn có thể chọn để xem chi tiết, cập nhật hoặc xóa nó.
Chúng ta cũng sẽ thêm một nút tạo trên đầu của bảng dữ liệu có thể được sử dụng để tạo bản ghi mới trong bảng nhân viên.
Tạo một tệp có tên ‘index.php‘ và đặt đoạn mã sau vào đó:
Sau khi điền một số bản ghi, chúng ta nhận được dữ liệu giống như hình bên dưới.
4. Tạo trang Create
Trong phần này, chúng ta sẽ xây dựng chức năng Create cho ứng dụng CRUD của chúng ta.
Hãy tạo một tệp có tên ‘create.php‘ và đặt đoạn code sau vào trong đó.
Nó sẽ tạo ra một biểu mẫu để có thể được sử dụng để chèn các bản ghi vào bảng employees.
Hướng thủ tục:
<?php
// Include file config.php
require_once "config.php";
// Xác định các biến và khởi tạo các giá trị trống
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Xác thực tên
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "Please enter a name.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Xác thực địa chỉ
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
// Xác thực lương
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "Please enter the salary amount.";
} elseif(!ctype_digit($input_salary)){
$salary_err = "Please enter a positive integer value.";
} else{
$salary = $input_salary;
}
// Kiểm tra lỗi đầu vào trước khi chèn vào cơ sở dữ liệu
if(empty($name_err) && empty($address_err) && empty($salary_err)){
// Chuẩn bị một câu lệnh insert
$sql = "INSERT INTO employees (name, address, salary) VALUES (?, ?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "sss", $param_name, $param_address, $param_salary);
// Thiết lập tham số
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
// Tạo bản ghi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
}
// Đóng kết nối
mysqli_close($link);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Create Record</h2>
</div>
<p>Please fill this form and submit to add employee record to the database.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
<label>Name</label>
<input type="text" name="name" class="form-control" value="<?php echo $name; ?>">
<span class="help-block"><?php echo $name_err;?></span>
</div>
<div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_err;?></span>
</div>
<div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>">
<label>Salary</label>
<input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>">
<span class="help-block"><?php echo $salary_err;?></span>
</div>
<input type="submit" class="btn btn-primary" value="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Hướng đối tượng:
<?php
// Include file config.php
require_once "config.php";
// Xác định các biến và khởi tạo các giá trị trống
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Xác thực tên
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "Please enter a name.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Xác thực địa chỉ
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
// Xác thực lương
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "Please enter the salary amount.";
} elseif(!ctype_digit($input_salary)){
$salary_err = "Please enter a positive integer value.";
} else{
$salary = $input_salary;
}
// Kiểm tra lỗi đầu vào trước khi chèn vào cơ sở dữ liệu
if(empty($name_err) && empty($address_err) && empty($salary_err)){
// Chuẩn bị một câu lệnh insert
$sql = "INSERT INTO employees (name, address, salary) VALUES (?, ?, ?)";
if($stmt = $mysqli->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bind_param("sss", $param_name, $param_address, $param_salary);
// Thiết lập tham số
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
// Tạo bản ghi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
$stmt->close();
}
// Đóng kết nối
$mysqli->close();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Create Record</h2>
</div>
<p>Please fill this form and submit to add employee record to the database.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
<label>Name</label>
<input type="text" name="name" class="form-control" value="<?php echo $name; ?>">
<span class="help-block"><?php echo $name_err;?></span>
</div>
<div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_err;?></span>
</div>
<div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>">
<label>Salary</label>
<input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>">
<span class="help-block"><?php echo $salary_err;?></span>
</div>
<input type="submit" class="btn btn-primary" value="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
PDO:
<?php
// Include file config.php
require_once "config.php";
// Xác định các biến và khởi tạo các giá trị trống
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if($_SERVER["REQUEST_METHOD"] == "POST"){
// Xác thực tên
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "Please enter a name.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Xác thực địa chỉ
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
// Xác thực lương
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "Please enter the salary amount.";
} elseif(!ctype_digit($input_salary)){
$salary_err = "Please enter a positive integer value.";
} else{
$salary = $input_salary;
}
// Kiểm tra lỗi đầu vào trước khi chèn vào cơ sở dữ liệu
if(empty($name_err) && empty($address_err) && empty($salary_err)){
// Chuẩn bị một câu lệnh insert
$sql = "INSERT INTO employees (name, address, salary) VALUES (:name, :address, :salary)";
if($stmt = $pdo->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bindParam(":name", $param_name);
$stmt->bindParam(":address", $param_address);
$stmt->bindParam(":salary", $param_salary);
// Thiết lập tham số
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
// Tạo bản ghi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
unset($stmt);
}
// Đóng kết nối
unset($pdo);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Create Record</h2>
</div>
<p>Please fill this form and submit to add employee record to the database.</p>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
<label>Name</label>
<input type="text" name="name" class="form-control" value="<?php echo $name; ?>">
<span class="help-block"><?php echo $name_err;?></span>
</div>
<div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_err;?></span>
</div>
<div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>">
<label>Salary</label>
<input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>">
<span class="help-block"><?php echo $salary_err;?></span>
</div>
<input type="submit" class="btn btn-primary" value="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Tệp ‘create.php‘ tương tự sẽ hiển thị biểu mẫu HTML và xử lý dữ liệu biểu mẫu đã gửi. Nó cũng sẽ thực hiện xác nhận cơ bản trên đầu vào của người dùng (dòng số 11 đến 37) trước khi lưu dữ liệu.
5. Tạo trang Read
Bây giờ là lúc để xây dựng chức năng Read trong ứng dụng CRUD của chúng ta.
Hãy tạo một tệp có tên ‘read.php‘ và đặt đoạn mã sau vào trong đó. Nó chỉ đơn giản là lấy các bản ghi từ bảng employess dựa trên thuộc tính id của nhân viên.
Hướng thủ tục:
<?php
// Kiểm tra sự tồn tại của tham số id trước khi xử lý thêm
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
// Include file config.php
require_once "config.php";
// Chuẩn bị câu lệnh Select
$sql = "SELECT * FROM employees WHERE id = ?";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "i", $param_id);
// Thiết lập tham số
$param_id = trim($_GET["id"]);
// Cố gắng thực thi câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
$result = mysqli_stmt_get_result($stmt);
if(mysqli_num_rows($result) == 1){
/* Lấy hàng kết quả dưới dạng một mảng kết hợp. Vì tập kết quả chỉ chứa một hàng, chúng tôi không cần sử dụng vòng lặp while */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
// Lấy giá trị trường riêng lẻ
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
// URL không chứa tham số id hợp lệ. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
// Đóng kết nối
mysqli_close($link);
} else{
// URL không chứa tham số id. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>View Record</h1>
</div>
<div class="form-group">
<label>Name</label>
<p class="form-control-static"><?php echo $row["name"]; ?></p>
</div>
<div class="form-group">
<label>Address</label>
<p class="form-control-static"><?php echo $row["address"]; ?></p>
</div>
<div class="form-group">
<label>Salary</label>
<p class="form-control-static"><?php echo $row["salary"]; ?></p>
</div>
<p><a href="index.php" class="btn btn-primary">Back</a></p>
</div>
</div>
</div>
</div>
</body>
</html>
Hướng đối tượng:
<?php
// Kiểm tra sự tồn tại của tham số id trước khi xử lý thêm
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
// Include file config.php
require_once "config.php";
// Chuẩn bị câu lệnh Select
$sql = "SELECT * FROM employees WHERE id = ?";
if($stmt = $mysqli->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bind_param("i", $param_id);
// Thiết lập tham số
$param_id = trim($_GET["id"]);
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
$result = $stmt->get_result();
if($result->num_rows == 1){
/* Lấy hàng kết quả dưới dạng một mảng kết hợp. Vì tập kết quả chỉ chứa một hàng, chúng tôi không cần sử dụng vòng lặp while */
$row = $result->fetch_array(MYSQLI_ASSOC);
// Lấy giá trị trường riêng lẻ
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
// URL không chứa tham số id hợp lệ. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
$stmt->close();
// Đóng kết nối
$mysqli->close();
} else{
// URL không chứa tham số id. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>View Record</h1>
</div>
<div class="form-group">
<label>Name</label>
<p class="form-control-static"><?php echo $row["name"]; ?></p>
</div>
<div class="form-group">
<label>Address</label>
<p class="form-control-static"><?php echo $row["address"]; ?></p>
</div>
<div class="form-group">
<label>Salary</label>
<p class="form-control-static"><?php echo $row["salary"]; ?></p>
</div>
<p><a href="index.php" class="btn btn-primary">Back</a></p>
</div>
</div>
</div>
</div>
</body>
</html>
PDO:
<?php
// Kiểm tra sự tồn tại của tham số id trước khi xử lý thêm
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
// Include file config.php
require_once "config.php";
// Chuẩn bị câu lệnh Select
$sql = "SELECT * FROM employees WHERE id = :id";
if($stmt = $pdo->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bindParam(":id", $param_id);
// Thiết lập tham số
$param_id = trim($_GET["id"]);
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
if($stmt->rowCount() == 1){
/* Lấy hàng kết quả dưới dạng một mảng kết hợp. Vì tập kết quả chỉ chứa một hàng, chúng tôi không cần sử dụng vòng lặp while */
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// Lấy giá trị trường riêng lẻ
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
// URL không chứa tham số id hợp lệ. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
unset($stmt);
// Đóng kết nối
unset($pdo);
} else{
// URL không chứa tham số id. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>View Record</h1>
</div>
<div class="form-group">
<label>Name</label>
<p class="form-control-static"><?php echo $row["name"]; ?></p>
</div>
<div class="form-group">
<label>Address</label>
<p class="form-control-static"><?php echo $row["address"]; ?></p>
</div>
<div class="form-group">
<label>Salary</label>
<p class="form-control-static"><?php echo $row["salary"]; ?></p>
</div>
<p><a href="index.php" class="btn btn-primary">Back</a></p>
</div>
</div>
</div>
</div>
</body>
</html>
6. Tạo trang Update
Tương tự, chúng ta có thể xây dựng chức năng Update trong ứng dụng CRUD.
Hãy tạo một tệp có tên ‘update.php‘ và đặt đoạn mã sau vào trong nó.
Nó sẽ cập nhật các bản ghi hiện có trong bảng employees dựa trên thuộc tính id của nhân viên.
Hướng thủ tục:
<?php
// Include file config.php
require_once "config.php";
// Xác định các biến và khởi tạo với các giá trị trống
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if(isset($_POST["id"]) && !empty($_POST["id"])){
// Lấy dữ liệu đầu vào
$id = $_POST["id"];
// Xác thực tên
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "Please enter a name.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Xác thực địa chỉ
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
// Xác thực lương
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "Please enter the salary amount.";
} elseif(!ctype_digit($input_salary)){
$salary_err = "Please enter a positive integer value.";
} else{
$salary = $input_salary;
}
// Kiểm tra lỗi đầu vào trước khi chèn vào cơ sở dữ liệu
if(empty($name_err) && empty($address_err) && empty($salary_err)){
// Chuẩn bị câu lệnh Update
$sql = "UPDATE employees SET name=?, address=?, salary=? WHERE id=?";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "sssi", $param_name, $param_address, $param_salary, $param_id);
// Thiết lập tham số
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
$param_id = $id;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
// Update thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
}
// Đóng két nối
mysqli_close($link);
} else{
// Kiểm tra sự tồn tại của tham số id trước khi xử lý thêm
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
// Lấy tham số URL
$id = trim($_GET["id"]);
// Chuẩn bị câu lệnh select
$sql = "SELECT * FROM employees WHERE id = ?";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "i", $param_id);
// Thiết lập tham số
$param_id = $id;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
$result = mysqli_stmt_get_result($stmt);
if(mysqli_num_rows($result) == 1){
/* Lấy hàng kết quả dưới dạng một mảng kết hợp. Vì tập kết quả chỉ chứa một hàng, chúng ta không cần sử dụng vòng lặp while */
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
// Lấy giá trị trường riêng lẻ
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
// URL không có id hợp lệ. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
// Đóng kết nối
mysqli_close($link);
} else{
// URL không chứa tham số id. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Update Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Update Record</h2>
</div>
<p>Please edit the input values and submit to update the record.</p>
<form action="<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method="post">
<div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
<label>Name</label>
<input type="text" name="name" class="form-control" value="<?php echo $name; ?>">
<span class="help-block"><?php echo $name_err;?></span>
</div>
<div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_err;?></span>
</div>
<div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>">
<label>Salary</label>
<input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>">
<span class="help-block"><?php echo $salary_err;?></span>
</div>
<input type="hidden" name="id" value="<?php echo $id; ?>"/>
<input type="submit" class="btn btn-primary" value="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Hướng đối tượng:
<?php
// Include file config.php
require_once "config.php";
// Xác định các biến và khởi tạo với các giá trị trống
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if(isset($_POST["id"]) && !empty($_POST["id"])){
// Lấy dữ liệu đầu vào
$id = $_POST["id"];
// Xác thực tên
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "Please enter a name.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Xác thực địa chỉ
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
// Xác thức lương
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "Please enter the salary amount.";
} elseif(!ctype_digit($input_salary)){
$salary_err = "Please enter a positive integer value.";
} else{
$salary = $input_salary;
}
// Kiểm tra lỗi đầu vào trước khi chèn vào cơ sở dữ liệu
if(empty($name_err) && empty($address_err) && empty($salary_err)){
// Chuẩn bị câu lệnh Update
$sql = "UPDATE employees SET name=?, address=?, salary=? WHERE id=?";
if($stmt = $mysqli->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bind_param("sssi", $param_name, $param_address, $param_salary, $param_id);
// Thiết lập tham số
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
$param_id = $id;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
// Update bản ghi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
$stmt->close();
}
// Đóng kết nối
$mysqli->close();
} else{
// Kiểm tra sự tồn tại của tham số id trước khi xử lý thêm
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
// Lấy tham số URL
$id = trim($_GET["id"]);
// Chuẩn bị câu lệnh Select
$sql = "SELECT * FROM employees WHERE id = ?";
if($stmt = $mysqli->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bind_param("i", $param_id);
// Thiết lập tham số
$param_id = $id;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
$result = $stmt->get_result();
if($result->num_rows == 1){
/* Lấy hàng kết quả dưới dạng một mảng kết hợp. Vì tập kết quả chỉ chứa một hàng, chúng tôi không cần sử dụng vòng lặp while */
$row = $result->fetch_array(MYSQLI_ASSOC);
// Lấy giá trị trường riêng lẻ
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
// URL không chứa id hợp lệ. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.
}
}
// Đóng câu lệnh
$stmt->close();
// Đóng kết nối
$mysqli->close();
} else{
// URL không chứa tham số id. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Update Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Update Record</h2>
</div>
<p>Please edit the input values and submit to update the record.</p>
<form action="<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method="post">
<div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
<label>Name</label>
<input type="text" name="name" class="form-control" value="<?php echo $name; ?>">
<span class="help-block"><?php echo $name_err;?></span>
</div>
<div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_err;?></span>
</div>
<div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>">
<label>Salary</label>
<input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>">
<span class="help-block"><?php echo $salary_err;?></span>
</div>
<input type="hidden" name="id" value="<?php echo $id; ?>"/>
<input type="submit" class="btn btn-primary" value="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
PDO:
<?php
// Include file config.php
require_once "config.php";
// Xác định các biến và khởi tạo với các giá trị trống
$name = $address = $salary = "";
$name_err = $address_err = $salary_err = "";
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if(isset($_POST["id"]) && !empty($_POST["id"])){
// Lấy dữ liệu đầu vào
$id = $_POST["id"];
// Xác thực tên
$input_name = trim($_POST["name"]);
if(empty($input_name)){
$name_err = "Please enter a name.";
} elseif(!filter_var($input_name, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
$name_err = "Please enter a valid name.";
} else{
$name = $input_name;
}
// Xác thực địa chỉ
$input_address = trim($_POST["address"]);
if(empty($input_address)){
$address_err = "Please enter an address.";
} else{
$address = $input_address;
}
// Xác thực lương
$input_salary = trim($_POST["salary"]);
if(empty($input_salary)){
$salary_err = "Please enter the salary amount.";
} elseif(!ctype_digit($input_salary)){
$salary_err = "Please enter a positive integer value.";
} else{
$salary = $input_salary;
}
// Kiểm tra lỗi đầu vào trước khi chèn vào cơ sở dữ liệu
if(empty($name_err) && empty($address_err) && empty($salary_err)){
// Chuẩn bị câu lệnh Update
$sql = "UPDATE employees SET name=:name, address=:address, salary=:salary WHERE id=:id";
if($stmt = $pdo->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bindParam(":name", $param_name);
$stmt->bindParam(":address", $param_address);
$stmt->bindParam(":salary", $param_salary);
$stmt->bindParam(":id", $param_id);
// Thiết lập tham số
$param_name = $name;
$param_address = $address;
$param_salary = $salary;
$param_id = $id;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
// Update thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
unset($stmt);
}
// Đóng két nối
unset($pdo);
} else{
// iểm tra sự tồn tại của tham số id trước khi xử lý thêm
if(isset($_GET["id"]) && !empty(trim($_GET["id"]))){
// Lấy tham số URL
$id = trim($_GET["id"]);
// Chuẩn bị câu lệnh select
$sql = "SELECT * FROM employees WHERE id = :id";
if($stmt = $pdo->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bindParam(":id", $param_id);
// Thiết lập tham số
$param_id = $id;
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
if($stmt->rowCount() == 1){
/* Lấy hàng kết quả dưới dạng một mảng kết hợp. Vì tập kết quả chỉ chứa một hàng, chúng ta không cần sử dụng vòng lặp while */
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// Lấy giá trị trường riêng lẻ
$name = $row["name"];
$address = $row["address"];
$salary = $row["salary"];
} else{
// URL không có id hợp lệ. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
unset($stmt);
// Đóng kết nối
unset($pdo);
} else{
// URL không chứa tham số id. Chuyển hướng đến trang error
header("location: error.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Update Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h2>Update Record</h2>
</div>
<p>Please edit the input values and submit to update the record.</p>
<form action="<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method="post">
<div class="form-group <?php echo (!empty($name_err)) ? 'has-error' : ''; ?>">
<label>Name</label>
<input type="text" name="name" class="form-control" value="<?php echo $name; ?>">
<span class="help-block"><?php echo $name_err;?></span>
</div>
<div class="form-group <?php echo (!empty($address_err)) ? 'has-error' : ''; ?>">
<label>Address</label>
<textarea name="address" class="form-control"><?php echo $address; ?></textarea>
<span class="help-block"><?php echo $address_err;?></span>
</div>
<div class="form-group <?php echo (!empty($salary_err)) ? 'has-error' : ''; ?>">
<label>Salary</label>
<input type="text" name="salary" class="form-control" value="<?php echo $salary; ?>">
<span class="help-block"><?php echo $salary_err;?></span>
</div>
<input type="hidden" name="id" value="<?php echo $id; ?>"/>
<input type="submit" class="btn btn-primary" value="Submit">
<a href="index.php" class="btn btn-default">Cancel</a>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
7. Tạo trang Delete
Bây giờ, chúng ta sẽ xây dựng chức năng Delete trong ứng dụng CRUD.
Hãy tạo một tệp có tên ‘delete.php‘ và đặt đoạn mã sau vào trong nó.
Nó sẽ xóa các bản ghi hiện có khỏi bảng employees dựa trên thuộc tính id của nhân viên.
Hướng thủ tục:
<?php
// Quy trình xóa bản ghi sau khi đã xác nhận
if(isset($_POST["id"]) && !empty($_POST["id"])){
// Include file config.php
require_once "config.php";
// Chuẩn bị câu lệnh delete
$sql = "DELETE FROM employees WHERE id = ?";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "i", $param_id);
// Thiết lập tham số
$param_id = trim($_POST["id"]);
// Cố gắng thực thi câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
// Xóa bản ghi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
// Đóng kết nối
mysqli_close($link);
} else{
// Kiểm tra sự tồn tại của tham số id
if(empty(trim($_GET["id"]))){
// URL không chứa tham số id. Chuyển hướng đén trang error
header("location: error.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>Delete Record</h1>
</div>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="alert alert-danger fade in">
<input type="hidden" name="id" value="<?php echo trim($_GET["id"]); ?>"/>
<p>Are you sure you want to delete this record?</p><br>
<p>
<input type="submit" value="Yes" class="btn btn-danger">
<a href="index.php" class="btn btn-default">No</a>
</p>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Hướng đối tượng:
<?php
// Quy trình xóa bản ghi sau khi đã xác nhận
if(isset($_POST["id"]) && !empty($_POST["id"])){
// Include file config.php
require_once "config.php";
// Chuẩn bị câu lệnh delete
$sql = "DELETE FROM employees WHERE id = ?";
if($stmt = $mysqli->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bind_param("i", $param_id);
// Thiết lập tham số
$param_id = trim($_POST["id"]);
// Attempt to execute the prepared statement
if($stmt->execute()){
// Xóa bản thi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
$stmt->close();
// Đóng kết nối
$mysqli->close();
} else{
// Kiểm tra sự tồn tại của tham số id
if(empty(trim($_GET["id"]))){
// URL không chứa tham số id. Chuyển hướng đén trang error
header("location: error.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>Delete Record</h1>
</div>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="alert alert-danger fade in">
<input type="hidden" name="id" value="<?php echo trim($_GET["id"]); ?>"/>
<p>Are you sure you want to delete this record?</p><br>
<p>
<input type="submit" value="Yes" class="btn btn-danger">
<a href="index.php" class="btn btn-default">No</a>
</p>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
PDO:
<?php
// Quy trình xóa bản ghi sau khi đã xác nhận
if(isset($_POST["id"]) && !empty($_POST["id"])){
// Include file config.php
require_once "config.php";
// Chuẩn bị câu lệnh delete
$sql = "DELETE FROM employees WHERE id = :id";
if($stmt = $pdo->prepare($sql)){
// Liên kết các biến với câu lệnh đã chuẩn bị
$stmt->bindParam(":id", $param_id);
// Thiết lập tham số
$param_id = trim($_POST["id"]);
// Cố gắng thực thi câu lệnh đã chuẩn bị
if($stmt->execute()){
// Xóa bản ghi thành công. Chuyển hướng đến trang đích
header("location: index.php");
exit();
} else{
echo "Oh, no. Có gì đó sai sai. Vui lòng thử lại.";
}
}
// Đóng câu lệnh
unset($stmt);
// Đóng kết nối
unset($pdo);
} else{
// Kiểm tra sự tồn tại của tham số id
if(empty(trim($_GET["id"]))){
// URL không chứa tham số id. Chuyển hướng đén trang error
header("location: error.php");
exit();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>View Record</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
<style type="text/css">
.wrapper{
width: 500px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<h1>Delete Record</h1>
</div>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<div class="alert alert-danger fade in">
<input type="hidden" name="id" value="<?php echo trim($_GET["id"]); ?>"/>
<p>Are you sure you want to delete this record?</p><br>
<p>
<input type="submit" value="Yes" class="btn btn-danger">
<a href="index.php" class="btn btn-default">No</a>
</p>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
8. Tạo trang Error
Cuối cùng, hãy tạo thêm một tệp ‘error.php‘.
Trang này sẽ được hiển thị nếu yêu cầu không hợp lệ, tức là nếu tham số id bị thiếu trong chuỗi truy vấn URL hoặc nó không hợp lệ.
Trong bài hướng dẫn tự học lập trình PHP này, bạn sẽ tìm hiểu làm thế nào để sử dụng PHP để xóa (DELETE) các bản ghi từ bảng MySQL.
Trong bài hướng dẫn tự học lập trình PHP này, bạn sẽ tìm hiểu làm thế nào để sử dụng PHP để xóa (DELETE) các bản ghi từ bảng MySQL.
Xóa bảng cơ sở dữ liệu với câu lệnh DELETE
Giống như khi bạn chèn các bản ghi vào các bảng CSDL, bạn cũng có thể xóa (DELETE) các bản ghi khỏi một bảng CSDL bằng cách sử dụng câu lệnh DELETE trong SQL.
Câu lệnh DELETE thường được sử dụng kết hợp với mệnh đề WHERE để chỉ xóa những bản ghi phù hợp với tiêu chí cụ thể.
Cú pháp cơ bản của câu lệnh DELETE
DELETE FROM table_name WHERE column_name=some_value
Bây giờ, giống như tất cả những bài khác, chúng ta hãy tạo một truy vấn SQL bằng cách sử dụng câu lệnh DELETE và mệnh đề WHERE, sau đó chúng ta sẽ thực hiện truy vấn này thông qua việc chuyển nó đến hàm mysqli_query() của PHP để xóa các bản ghi bảng.
Hãy xem xét bảng person sau trong cơ sở dữ liệu demo:
Hướng dẫn sử dụng xóa bản ghi trong bảng CSDL với câu lệnh DELETE
Ví dụ 1: Hướng dẫn xóa bản ghi bằng câu lệnh DELETE sử dụng MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối tới MySQL Server. Giả sử bạn đang chạy MySQL Server
với thiết lập mặc định (user 'root' và không có mật khẩu)*/
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Cố gắng thực thi truy vấn
$sql = "DELETE FROM persons WHERE first_name='Triệu Tòn'";
if(mysqli_query($link, $sql)){
echo "Xóa bản ghi thành công.";
} else{
echo "ERROR: Không thể thực thi truy vấn $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
Ví dụ 2: Hướng dẫn xóa bản ghi bằng câu lệnh DELETE sử dụng MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối tới MySQL Server. Giả sử bạn đang chạy MySQL Server
với thiết lập mặc định (user 'root' và không có mật khẩu)*/
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực thi truy vấn
$sql = "DELETE FROM persons WHERE first_name='Triệu Tòn'";
if($mysqli->query($sql) === true){
echo "Xóa bản ghi thành công.";
} else{
echo "ERROR: Không thể thực thi truy vấn $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
Ví dụ 3: Hướng dẫn xóa bản ghi bằng câu lệnh DELETE sử dụng PDO
<?php
/* Cố gắng kết nối tới MySQL Server. Giả sử bạn đang chạy MySQL Server
với thiết lập mặc định (user 'root' và không có mật khẩu)*/
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập chế độ PDO Error thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
$sql = "DELETE FROM persons WHERE first_name='Triệu Tòn'";
$pdo->exec($sql);
echo "Xóa bản ghi thành công.";
} catch(PDOException $e){
die("ERROR: Không thể thực thi truy vấn $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>
Đây là kết quả sau khi sử dụng câu lệnh DELETE xóa first_name là “Triệu Tòn”
CẢNH BÁO: Mệnh đề WHERE trong câu lệnh DELETE chỉ định bản ghi hoặc bản ghi nào sẽ bị xóa. Nếu bạn bỏ qua mệnh đề WHERE, tất cả các bản ghi sẽ bị xóa.
Bạn đã hiểu cách sử dụng câu lệnh DELETE chưa?
Câu lệnh DELETE sử dụng để xóa bản ghi trong CSDL. Tuy nhiên, câu lệnh DELETE khá nguy hiểm bởi nếu bạn bỏ qua mệnh đề WHERE, toàn bộ dữ liệu sẽ bị xóa.
Chúng ta sẽ thực hiện sử dụng câu lệnh UPDATE theo 3 cách: Sử dụng MySQLi hướng thủ tục, hướng đối tượng và sử dụng PDO.
Trong bài hướng dẫn học lập trình MySQL với PHP này. Mình sẽ hướng dẫn bạn về câu lệnh UPDATE.
Cập nhật dữ liệu lên bảng CSDL
Các câu lệnh UPDATE được sử dụng để thay đổi hoặc sửa đổi các bản ghi hiện có trong một bảng cơ sở dữ liệu.
Giả sử, website / ứng dụng của bạn cho phép người dùng thay đổi thông tin tài khoản sau khi đã tạo hồ sơ.
Lúc này người dùng sẽ nhập thông tin và gửi truy vấn đến CSDL (thực ra họ nhập xong thì Enter thôi. Chúng ta sẽ phải bắt sự kiện để chèn truy vấn) để yêu cầu cập nhật lại thông tin theo những thay đổi của họ.
Hoặc thực hiện bất kỳ thay đổi nào trên website mà cần thay đổi dữ liệu trên bảng CSDL thì cũng cần đến UPDATE.
Để làm việc này, câu lệnh UPDATE cần được sử dụng kết hợp với Mệnh đề WHERE để thực thiện cập nhật dữ liệu tại nơi được chỉ định.
Cú pháp cơ bản của câu lệnh UPDATE như sau:
UPDATE table_name SET column1=value, column2=value2,... WHERE column_name=some_value
Và cũng như các bài học trước. Ví dụ minh họa về câu lệnh UPDATE là rất cần thiết để bạn hiểu rõ cách sử dụng.
Chúng ta hãy tạo một truy vấn SQL bằng cách sử dụng câu lệnh UPDATE và mệnh đề WHERE, sau đó chúng ta sẽ thực hiện truy vấn này thông qua việc chuyển nó đến hàm mysqli_query() của PHP để cập nhật các bản ghi trên bảng CSDL.
Hãy xem xét bảng persons sau trong cơ sở dữ liệu demo:
Code PHP trong các ví dụ sau sẽ cập nhật địa chỉ email của một người trong bảng persons có id bằng 1.
Ví dụ hướng dẫn sử dụng câu lệnh UPDATE
Chúng ta sẽ thực hiện sử dụng câu lệnh UPDATE theo 3 cách: Sử dụng MySQLi hướng thủ tục, hướng đối tượng và sử dụng PDO.
Ví dụ 1: Hướng dẫn sử dụng câu lệnh UPDATE bằng MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối tới MySQL Server. Giả sử bạn đang chạy MySQL Server với thiết lập mặc định (user 'root' và không có mật khẩu)*/
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối.". mysqli_connect_error());
}
// Thực thi câu lệnh UPDATE
$sql = "UPDATE persons SET email='trieusenh1@gmail.com' WHERE id=1";
if(mysqli_query($link, $sql)){
echo "Bản ghi được cập nhật thành công";
}else{
echo "ERROR: Không thể cập nhật bản ghi $sql".mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
Ví dụ 2: Hướng dẫn sử dụng câu lệnh UPDATE bằng MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối tới MySQL Server. Giả sử bạn đang chạy MySQL Server với thiết lập mặc định (user 'root' và không có mật khẩu)*/
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối.". $mysqli->connect_error);
}
// Thực thi câu lệnh UPDATE
$sql = "UPDATE persons SET email='trieusenh1@gmail.com' WHERE id=1";
if($mysqli->query($sql) === true{
echo "Bản ghi được cập nhật thành công";
}else{
echo "ERROR: Không thể cập nhật bản ghi $sql. " .$mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
Ví dụ 3: Hướng dẫn sử dụng câu lệnh UPDATE với PDO
<?php
/* Cố gắng kết nối tới MySQL Server. Giả sử bạn đang chạy MySQL Server với thiết lập mặc định (user 'root' và không có mật khẩu)*/
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập chế độ PDO ERROR thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Thực thi câu lệnh UPDATE
try{
$sql = "UPDATE persons SET email='trieusenh1@gmail.com' WHERE id=1";
$pdo->exec($sql);
echo "Cập nhật bản ghi thành công.";
} catch(PDOException $e){
die("ERROR: Không thể thực thi truy $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>
Kết thúc, trong CSDL chúng ta có được kết quả như sau:
Lời kết
Như vậy là qua bài này bạn đã được tìm hiểu về cách sử dụng câu lệnh UPDATE để cập nhật dữ liệu lên bảng CSDL.
Cách làm này là cách làm cứng để bạn hiểu chúng ta sẽ làm như thế nào. Còn trong thực tế, dữ liệu cần cập nhật của chúng ta sẽ là động, chúng ta sẽ phải bắt sự kiện để thực thi.
Trong bài Hướng dẫn sử dụng MySQL trong PHP này, bạn sẽ tìm hiểu làm thế nào để sắp xếp và hiển thị các dữ liệu từ bảng MySQL theo thứ tự tăng dần và giảm dần.
Trong bài Hướng dẫn sử dụng MySQL trong PHP này, bạn sẽ tìm hiểu làm thế nào để sắp xếp và hiển thị các dữ liệu từ bảng MySQL theo thứ tự tăng dần và giảm dần.
1. Sắp xếp thứ tự của kết quả truy vấn với ORDER BY
Mệnh đề ORDER BY được sử dụng kết hợp với câu lệnh SELECT để xem dữ liệu từ một bảng được sắp xếp theo một trường cụ thể.
Mệnh đề ORDER BY cho phép bạn xác định tên trường để sắp xếp theo và hướng sắp xếp tăng dần hoặc giảm dần.
Cú pháp cơ bản của mệnh đề ORDER BY như sau:
SELECT column_name(s) FROM table_name ORDER BY column_name(s) ASC|DESC
Trong đó, theo mặc định kết quả của truy vấn sử dụng ORDER BY sẽ sắp xếp theo thứ tự tăng dần (ASC).
Nếu bạn muốn sắp xếp theo thứ tự giảm dần, hãy thêm tùy chọn DESC vào câu truy vấn.
Ví dụ sử dụng ORDER BY
Trong ví dụ này, chúng ta hãy tạo một truy vấn SQL bằng cách sử dụng mệnh đề ORDER BY trong câu lệnh SELECT.
Sau đó chúng ta sẽ thực hiện truy vấn này thông qua việc chuyển nó đến hàm mysqli_query() của PHP để lấy dữ liệu theo thứ tự.
Hãy xem xét bảng person sau trong cơ sở dữ liệu demo:
2.1. Sử dụng ORDER BY theo phương pháp MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối với MySQL Server. Giả sử bạn đang chạy MySQL Server với tài khoản mặc định (user là root và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Cố gắng thực thi truy vấn với mệnh đề ORDER BY
// Mặc định sắp xếp theo thứ tự tăng dần
$sql = "SELECT * FROM persons ORDER BY first_name";
if($result = mysqli_query($link, $sql)){
if(mysqli_num_rows($result) > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
mysqli_free_result($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
2.2. Sử dụng ORDER BY theo phương pháp MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối với MySQL Server. Giả sử bạn đang chạy MySQL Server với tài khoản mặc định (user là root và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực thi truy vấn với mệnh đề ORDER BY
// Mặc định sắp xếp theo thứ tự tăng dần
$sql = "SELECT * FROM persons ORDER BY firts_name";
if($result = $mysqli->query($sql)){
if($result->num_rows > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch_array()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
$result->free();
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
2.3. Sử dụng ORDER BY với PDO
<?php
/* Cố gắng kết nối với MySQL Server. Giả sử bạn đang chạy MySQL Server với tài khoản mặc định (user là root và không có mật khẩu) */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập PDO error thành ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
$sql = "SELECT * FROM persons ORDER BY first_name";
$result = $pdo->query($sql);
if($result->rowCount() > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ biến
unset($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} catch(PDOException $e){
die("ERROR: Không thể thực thi $sql. " . $e->getMessage());
}
// Close connection
unset($pdo);
?>
Sau khi thực hiện, chúng ta sẽ có được kết quả như sau:
Bạn đã hiểu cách sử dụng mệnh đề ORDER BY chưa?
Như vậy là bài này mình đã hướng dẫn bạn sử dụng mệnh đề ORDER BY để sắp xếp dữ liệu lấy ra từ bảng MySQL theo chiều tăng dần (ASC) hoặc giảm dần (DESC).
Câu lệnh SQL sử dụng ORDER BY cũng đơn giản phải không nào? 😀
Trong bài hướng dẫn Học PHP và MySQL này, bạn sẽ được tìm hiểu làm thế nào để lấy giới hạn một số bản ghi từ một cơ sở dữ liệu bằng mệnh đề LIMIT.
Trong bài hướng dẫn Học PHP và MySQL này, bạn sẽ được tìm hiểu làm thế nào để lấy giới hạn một số bản ghi từ một cơ sở dữ liệu bằng mệnh đề LIMIT.
Mệnh đề LIMIT là gì?
Mệnh đề LIMIT được sử dụng để hạn chế số lượng hàng (rows) được trả về bởi câu lệnh SELECT.
Tính năng này rất hữu ích để tối ưu hóa thời gian tải trang cũng như tăng cường khả năng đọc của trang web.
Ví dụ: Bạn có thể chia số lượng lớn các bản ghi trong nhiều trang bằng cách sử dụng phân trang PHP, trong đó số lượng bản ghi giới hạn sẽ được tải trên mỗi trang từ cơ sở dữ liệu khi người dùng yêu cầu trang đó bằng cách nhấp vào liên kết phân trang.
Cú pháp cơ bản của mệnh đề LIMIT như sau:
SELECT column_name(s) FROM table_name LIMIT row_offset, row_count;
Tham số trong mệnh đề LIMIT
Mệnh đề LIMIT chấp nhận một hoặc hai tham số (phải là số nguyên không âm):
Khi hai tham số được chỉ định, tham số đầu tiên chỉ định điểm bắt đầu, trong khi tham số thứ hai chỉ định số lượng hàng cần trả về. (Lưu ý: Hàng đầu tiên là 0)
Trong khi đó, khi chỉ có một tham số được đưa ra, nó chỉ định số lượng hàng tối đa sẽ trả về từ đầu tập kết quả.
Ví dụ: Để lấy ba hàng đầu tiên trong CSDL, bạn có thể sử dụng truy vấn sau:
SELECT * FROM persons LIMIT 3;
Để lấy từ hàng 2 đến 4 (cả hàng 4), bạn có thể sử dụng truy vấn sau:
SELECT * FROM persons LIMIT 1, 3;
Bây giờ, chúng ta hãy tạo một truy vấn SQL bằng mệnh đề LIMIT trong câu lệnh SELECT, sau đó chúng ta sẽ thực hiện truy vấn này thông qua việc chuyển nó đến hàm mysqli_query() của PHP lấy một số bản ghi nhất định.
Hãy xem xét bảng person sau trong cơ sở dữ liệu demo:
Đoạn code PHP trong ví dụ sau sẽ chỉ hiển thị ba hàng từ bảng person:
Ví dụ 1: Sử dụng mệnh đề LIMIT với MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Cố gắng thực hiện truy vấn
$sql = "SELECT * FROM persons LIMIT 3";
if($result = mysqli_query($link, $sql)){
if(mysqli_num_rows($result) > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
mysqli_free_result($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
Ví dụ 2: Sử dụng mệnh đề LIMIT với MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực thi truy vấn
$sql = "SELECT * FROM persons LIMIT 3";
if($result = $mysqli->query($sql)){
if($result->num_rows > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch_array()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
$result->free();
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
Ví dụ 3: Sử dụng mệnh đề LIMIT với PDO
<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập chế độ PDO error thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
$sql = "SELECT * FROM persons LIMIT 3";
$result = $pdo->query($sql);
if($result->rowCount() > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
unset($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} catch(PDOException $e){
die("ERROR: Không thể thực thi $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>
Sau khi giới hạn kết quả trả về thì chúng ta nhận được như sau:
Note: Nếu bạn để ý, trong một số ví dụ gần đây, mình chỉ cần thay đổi câu lệnh truy vấn SQL. Các câu lệnh khác thì giống nhau.
Lời kết
Như vậy là bạn đã biết cách giới hạn bản ghi trả về từ câu lệnh SELECT bằng mệnh đề LIMIT.
Sử dụng mệnh đề LIMIT trong MySQL cũng đơn giản thôi phải không?
Bạn sẽ được hướng dẫn tìm hiểu mệnh đề WHERE để chọn các bản ghi từ bảng cơ sở dữ liệu MySQL dựa trên các điều kiện cụ thể bằng PHP.
Trong bài hướng dẫn tự học PHP và MySQL này, bạn sẽ được hướng dẫn tìm hiểu mệnh đề WHEREđể chọn các bản ghi từ bảng cơ sở dữ liệu MySQL dựa trên các điều kiện cụ thể bằng PHP.
Lọc bản ghi với mệnh đề WHERE
Mệnh đề WHERE có nghĩa là Ở…
WHERE được sử dụng để trích xuất những bản ghi đáp ứng một điều kiện cụ thể.
Cú pháp cơ bản của mệnh đề WHERE như sau:
SELECT column_name(s) FROM table_name WHERE column_name operator value
Bây giờ,
Chúng ta hãy tạo một truy vấn SQL bằng cách sử dụng mệnh đề WHERE trong câu lệnh SELECT, sau đó chúng ta sẽ thực hiện truy vấn này thông qua việc chuyển nó đến hàm mysqli_query() của PHP để lấy dữ liệu được lọc.
Chúng ta có một bảng person bên trong cơ sở dữ liệu demo có các bản ghi sau:
Mã PHP sau đây chọn tất cả các hàng từ bảng person trong đó first_name = ‘Triệu Tòn’:
1. Hướng dẫn sử dụng Mệnh đề WHERE với MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Cố gắng thực hiện truy vấn
$sql = "SELECT * FROM persons WHERE first_name='Triệu Tòn'";
if($result = mysqli_query($link, $sql)){
if(mysqli_num_rows($result) > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
mysqli_free_result($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
2. Hướng dẫn sử dụng Mệnh đề WHERE với MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực thi truy vấn
$sql = "SELECT * FROM persons WHERE first_name='Triệu Tòn'";
if($result = $mysqli->query($sql)){
if($result->num_rows > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch_array()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
$result->free();
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
3. Hướng dẫn sử dụng Mệnh đề WHERE với PDO
<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập chế độ PDO error thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
$sql = "SELECT * FROM persons WHERE first_name='Triệu Tòn'";
$result = $pdo->query($sql);
if($result->rowCount() > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
unset($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} catch(PDOException $e){
die("ERROR: Không thể thực thi $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>
Sau khi sử dụng mệnh đề WHERE để lọc bản ghi với fisrt_name = ‘Triệu Tòn’, chúng ta nhận được kết quả như sau:
Bạn đã hiểu cách sử dụng mệnh đề WHERE chưa?
Mệnh đề WHERE trong MySQL được sử dụng để lọc bản ghi theo một điều kiện nào đó. Sau đó chúng ta có thể sử dụng kết quả lọc như thế nào tùy thích.
Trên đây bạn đã được hướng dẫn sử dụng mệnh đề WHERE để lọc bản ghi với 3 cách. Nếu có bất kỳ điều gì chưa hiểu, vui lòng để lại comment bạn nhé.!
Bây giờ là lúc để lấy dữ liệu từ những gì đã chèn trong các bài học trước để sử dụng.
Câu lệnh SELECT trong SQL được sử dụng để chọn các bản ghi từ các bảng cơ sở dữ liệu. Cú pháp cơ bản của nó là như sau:
SELECT column1_name, column2_name, columnN_name FROM table_name;
Chúng ta hãy tạo một truy vấn SQL bằng cách sử dụng câu lệnh SELECT, sau đó chúng ta sẽ thực hiện truy vấn SQL này thông qua việc chuyển nó đến hàm mysqli_query() của PHP để lấy dữ liệu từ bảng.
Xem xét bảng cơ sở dữ liệu person của chúng ta có các hồ sơ sau đây:
Code PHP trong ví dụ sau đây chọn tất cả dữ liệu được lưu trữ trong bảng person (sử dụng ký tự dấu hoa thị (*) thay cho tên cột sẽ chọn tất cả dữ liệu trong bảng).
SELECT * FROM table_name;
1. Sử dụng lệnh SELECT để chọn dữ liệu từ bảng với MySQLi hướng thủ tục
<?php
/*Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu)*/
$link = mysqli_connect("localhost", "root", "", "demo");
// Kểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Cố gắng thực hiện câu lệnh SELECT
$sql = "SELECT * FROM persons";
if($result = mysqli_query($link, $sql)){
if(mysqli_num_rows($result) > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
mysqli_free_result($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi câu lệnh $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
2. Sử dụng lệnh SELECT để chọn dữ liệu từ bảng với MySQLi hướng đối tượng
<?php
/*Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu)*/
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực hiện câu lệnh SELECT
$sql = "SELECT * FROM persons";
if($result = $mysqli->query($sql)){
if($result->num_rows > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch_array()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
$result->free();
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} else{
echo "ERROR: Không thể thực thi câu lệnh $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
3. Sử dụng lệnh SELECT để chọn dữ liệu từ bảng với PDO
<?php
/*Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu)*/
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập chế độ PDO error thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Could not connect. " . $e->getMessage());
}
// Cố gắng thực hiện câu lệnh SELECT
try{
$sql = "SELECT * FROM persons";
$result = $pdo->query($sql);
if($result->rowCount() > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>first_name</th>";
echo "<th>last_name</th>";
echo "<th>email</th>";
echo "</tr>";
while($row = $result->fetch()){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['first_name'] . "</td>";
echo "<td>" . $row['last_name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Giải phóng bộ nhớ của biến
unset($result);
} else{
echo "Không có bản ghi nào được tìm thấy.";
}
} catch(PDOException $e){
die("ERROR: Không thể thực thi câu lệnh $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>
Giải thích code
Trong ví dụ trên, dữ liệu được trả về bởi hàm mysqli_query() được lưu trữ trong biến $result.
Mỗi lần hàm mysqli_fetch_array() được gọi, nó sẽ trả về hàng tiếp theo từ tập kết quả dưới dạng một mảng.
Vòng lặp while được sử dụng để lặp qua tất cả các hàng trong tập kết quả.
Cuối cùng, giá trị của từng trường có thể được truy cập từ hàng bằng cách chuyển chỉ mục trường hoặc tên trường cho biến $row như $row[‘id’] hoặc $row[0], $row[‘first_name’] hoặc $row[1], $row[‘last_name’] hoặc $row[2] và $row[’email’] hoặc $row[3].
Nếu bạn muốn sử dụng vòng lặp for, bạn có thể lấy giá trị bộ đếm vòng lặp hoặc số lượng hàng được truy vấn trả về bằng cách truyền biến $result cho hàm mysqli_num_rows().
Giá trị bộ đếm vòng lặp này xác định số lần vòng lặp sẽ chạy.
Bạn đã hiểu cách sử dụng câu lệnh SELECT để lấy dữ liệu trong MySQL chưa?
Câu lệnh SELECT là một câu lệnh phổ biến nhất khi bạn muốn thao tác với CSDL MySQL.
Hãy ghi nhớ cách sử dụng câu lệnh SELECT giống như là bảng cửu chương vậy nhé.
3 cách lấy ID cuối cùng trong bảng CSDL MySQL để giúp cho cả người mới bắt đầu học lập trình PHP cũng có thể hiểu.
Trong bài hướng dẫn tự học lập trình PHP và MySQL này, bạn sẽ tìm hiểu cách lấy ID duy nhất của hàng được chèn cuối cùng từ bảng cơ sở dữ liệu MySQL bằng PHP.
Cách lấy ID của hàng được chèn cuối cùng
Trong bài hướng dẫn Insert trong MySQL, bạn đã học rằng MySQL tự động tạo một ID duy nhất cho cột AUTO_INCREMENT mỗi khi bạn chèn một bản ghi hoặc hàng mới vào bảng.
Tuy nhiên, có một số tình huống bạn cần lấy ID được tạo tự động đó để chèn nó vào bảng thứ hai.
Trong những tình huống này, bạn có thể sử dụng hàm mysqli_insert_id() của PHP để lấy ID được tạo gần đây nhất, như trong ví dụ bên dưới đây:
Trong ví dụ này, chúng ta sẽ sử dụng cùng một bảng mà chúng ta đã tạo trong bài Cách tạo bảng CSDL trong MySQL, có bốn cột id, first_name, last_name và email, trong đó id là cột khóa chính (primary key) và được đánh dấu bằng AUTO_INCREMENT.
1. Hướng dẫn lấy ID cuối cùng trong CSDL MySQL với MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (người dùng 'root' không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Cố gắng thực hiện câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Ron', 'Weasley', 'ronweasley@mail.com')";
if(mysqli_query($link, $sql)){
// Lấy ID đã chèn cuối cùng
$last_id = mysqli_insert_id($link);
echo "Chèn bản ghi thành công. ID đã chèn cuối cùng là: " . $last_id;
} else{
echo "ERROR: Không thể thực thi câu lệnh $sql. " . mysqli_error($link);
}
// Đóng kết nối
mysqli_close($link);
?>
2. Hướng dẫn lấy ID cuối cùng trong CSDL MySQL với MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (người dùng 'root' không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Cố gắng thực hiện câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Ron', 'Weasley', 'ronweasley@mail.com')";
if($mysqli->query($sql) === true){
// Lấy ID đã chèn cuối cùng
$last_id = $mysqli->insert_id;
echo "Chèn bản ghi thành công. ID đã chèn cuối cùng là: " . $last_id;
} else{
echo "ERROR: Không thể thực thi câu lệnh $sql. " . $mysqli->error;
}
// Đóng kết nối
$mysqli->close();
?>
3. Hướng dẫn lấy ID cuối cùng trong CSDL MySQL với PDO
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (người dùng 'root' không có mật khẩu) */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập chế độ PDO error thành ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực hiện câu lệnh INSERT
try{
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES ('Ron', 'Weasley', 'ronweasley@mail.com')";
$pdo->exec($sql);
$last_id = $pdo->lastInsertId();
echo "Chèn bản ghi thành công. ID đã chèn cuối cùng là: " . $last_id;
} catch(PDOException $e){
die("ERROR: Không thể thực thi câu lệnh $sql. " . $e->getMessage());
}
// Đóng kết nối
unset($pdo);
?>
Bạn đã hiểu cách lấy ID cuối cùng trong MySQL chưa?
Mình hướng dẫn bạn cả 3 cách lấy ID cuối cùng trong bảng CSDL MySQL để giúp cho cả người mới bắt đầu có thể hiểu.
Hãy luyện tập vào ghi nhớ 3 cách lấy ID cuối cùng này nhé. Bạn sẽ sử dụng đến rất nhiều đấy.
Prepared Statement (còn được gọi là câu lệnh được tham số hóa) chỉ đơn giản là một mẫu truy vấn SQL có chứa trình giữ chỗ thay vì các giá trị tham số thực tế.
Trong bài hướng dẫn tự học PHP và MySQL này, bạn sẽ học cách sử dụng Prepared Statements trong MySQL bằng PHP.
Prepared Statement là gì?
Prepared Statement (còn được gọi là câu lệnh được tham số hóa) chỉ đơn giản là một mẫu truy vấn SQL có chứa trình giữ chỗ thay vì các giá trị tham số thực tế.
Các trình giữ chỗ này sẽ được thay thế bằng các giá trị thực tế tại thời điểm thực hiện câu lệnh.
MySQLi hỗ trợ sử dụng trình giữ chỗ vị trí ẩn danh (?), Như được hiển thị bên dưới:
INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?);
Trong khi đó, PDO hỗ trợ cả trình giữ chỗ vị trí ẩn danh (?), Cũng như các trình giữ chỗ được đặt tên.
Một trình giữ chỗ được đặt tên bắt đầu bằng dấu hai chấm (:) theo sau là một mã định danh, như thế này:
INSERT INTO persons (first_name, last_name, email)
VALUES (:first_name, :last_name, :email);
Việc thực hiện Prepared Statement bao gồm hai giai đoạn: Chuẩn bị và Thực thi.
Chuẩn bị: Ở giai đoạn chuẩn bị, một mẫu câu lệnh SQL được tạo và gửi đến máy chủ cơ sở dữ liệu. Máy chủ phân tích mẫu câu lệnh, thực hiện kiểm tra cú pháp và tối ưu hóa truy vấn và lưu trữ nó để sử dụng sau.
Thực thi: Trong quá trình thực thi, các giá trị tham số được gửi đến máy chủ. Máy chủ tạo một câu lệnh từ mẫu câu lệnh và sử dụng các giá trị này để thực thi nó.
Prepared Statement rất hữu ích, đặc biệt trong các tình huống khi bạn thực thi một câu lệnh cụ thể nhiều lần với các giá trị khác nhau.
Ví dụ, bạn cần thực hiện một loạt các câu lệnh INSERT. Prepared Statement sẽ giúp bạn tối ưu hóa công việc này.
Phần sau đây mô tả một số lợi ích chính của việc sử dụng Prepared Statement.
Ưu điểm của việc sử dụng Prepared Statement
Prepared Statement có thể thực hiện cùng một câu lệnh lặp đi lặp lại với hiệu quả cao, bởi vì câu lệnh chỉ được phân tích cú pháp một lần, trong khi nó có thể được thực thi nhiều lần.
Nó cũng giảm thiểu việc sử dụng băng thông, vì mỗi lần thực thi, chỉ có các giá trị giữ chỗ cần được truyền đến máy chủ cơ sở dữ liệu thay vì truyền cả câu lệnh SQL hoàn chỉnh.
Prepared Statement cũng cung cấp sự bảo vệ mạnh mẽ chống lại SQL injection (Hành động cố gắng truyền câu lệnh SQL để thao túng CSDL), bởi vì các giá trị tham số không được nhúng trực tiếp bên trong chuỗi truy vấn SQL.
Các giá trị tham số được gửi đến máy chủ cơ sở dữ liệu tách biệt với truy vấn bằng một giao thức khác và do đó không thể can thiệp vào nó.
Máy chủ sử dụng các giá trị này trực tiếp tại điểm thực hiện, sau khi mẫu câu lệnh được phân tích cú pháp.
Đó là lý do tại sao các Prepared Statement ít bị lỗi hơn và do đó được coi là một trong những yếu tố quan trọng nhất trong bảo mật cơ sở dữ liệu.
Ví dụ sau đây sẽ cho bạn thấy Prepared Statement được chuẩn bị thực sự hoạt động như thế nào:
Ví dụ sử dụng Prepared Statement
Cách #1. Sử dụng Prepared Statement bằng MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Chuẩn bị câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết biến với tham số trong câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
/* Thiết lập giá trị tham số và thực thi
câu lệnh 1 lần nữa để chèn một hàng khác */
$first_name = "Hermione";
$last_name = "Granger";
$email = "hermionegranger@mail.com";
mysqli_stmt_execute($stmt);
/* Thiết lập giá trị tham số và thực thi
câu lệnh 1 lần nữa để chèn một hàng */
$first_name = "Ron";
$last_name = "Weasley";
$email = "ronweasley@mail.com";
mysqli_stmt_execute($stmt);
echo "Chèn bản ghi thành công.";
} else{
echo "ERROR: Không thể chuẩn bị truy vấn: $sql. " . mysqli_error($link);
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
// Đóng kết nối
mysqli_close($link);
?>
Cách #2. Sử dụng Prepared Statement bằng MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Chuẩn bị câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
if($stmt = $mysqli->prepare($sql)){
// Liên kết biến với tham số trong câu lệnh đã chuẩn bị
$stmt->bind_param("sss", $first_name, $last_name, $email);
/* Thiết lập giá trị tham số và thực thi
câu lệnh 1 lần nữa để chèn một hàng khác */
$first_name = "Hermione";
$last_name = "Granger";
$email = "hermionegranger@mail.com";
$stmt->execute();
/* Thiết lập giá trị tham số và thực thi
câu lệnh 1 lần nữa để chèn một hàng */
$first_name = "Ron";
$last_name = "Weasley";
$email = "ronweasley@mail.com";
$stmt->execute();
echo "Chèn bản ghi thành công.";
} else{
echo "ERROR: Không thể chuẩn bị truy vấn: $sql. " . $mysqli->error;
}
// Đóng câu lệnh
$stmt->close();
// Đóng kết nối
$mysqli->close();
?>
Cách #3. Sử dụng Prepared Statement bằng PDO
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu) */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập PDO erorr thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi câu lệnh INSERT
try{
// Chuẩn bị câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
$stmt = $pdo->prepare($sql);
// Ràng buộc tham số
$stmt->bindParam(':first_name', $first_name, PDO::PARAM_STR);
$stmt->bindParam(':last_name', $last_name, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
/* Thiết lập giá trị tham số và thực thi
câu lệnh 1 lần nữa để chèn một hàng khác */
$first_name = "Hermione";
$last_name = "Granger";
$email = "hermionegranger@mail.com";
$stmt->execute();
/* Thiết lập giá trị tham số và thực thi
câu lệnh 1 lần nữa để chèn một hàng */
$first_name = "Ron";
$last_name = "Weasley";
$email = "ronweasley@mail.com";
$stmt->execute();
echo "Chèn bản ghi thành công.";
} catch(PDOException $e){
die("ERROR: Không thể chuẩn bị / thực thi truy vấn: $sql. " . $e->getMessage());
}
// Đóng câu lệnh
unset($stmt);
// Đóng kết nối
unset($pdo);
?>
Như bạn có thể thấy trong ví dụ trên, chúng tôi đã chuẩn bị câu lệnh INSERT chỉ một lần nhưng thực hiện nó nhiều lần bằng cách truyền tập hợp các tham số khác nhau.
Giải thích về ví dụ về Prepared Statement (Kiểu thủ tục)
Bên trong câu lệnh SQL INSERT (dòng số 12) của ví dụ trên, các dấu hỏi được sử dụng làm trình giữ chỗ cho các giá trị của trường first_name, last_name, email.
Hàm mysqli_stmt_bind_param() (dòng số 16) liên kết các biến với trình giữ chỗ (?) trong mẫu câu lệnh SQL.
Các phần giữ chỗ (?) Sẽ được thay thế bằng các giá trị thực được giữ trong các biến tại thời điểm thực thi. Chuỗi định nghĩa kiểu được cung cấp ở đối số thứ hai, tức là chuỗi ‘sss‘ chỉ định rằng kiểu dữ liệu của mỗi biến liên kết là chuỗi.
Chuỗi định nghĩa kiểu xác định kiểu dữ liệu của các biến liên kết tương ứng và chứa một hoặc nhiều trong bốn ký tự sau:
b — binary (như là hình ảnh, PDF, …)
d — double (Số thập phân)
i — integer (Số nguyên)
s — string (ký tự)
Số lượng biến liên kết và số lượng ký tự trong chuỗi định nghĩa kiểu phải khớp với số lượng giữ chỗ trong câu lệnh SQL mẫu.
Sử dụng Web Form để truyền dữ liệu và sử dụng Prepared Statement
Nếu bạn nhớ từ bài INSERT trong MySQL, chúng ta đã tạo một Form HTML để chèn dữ liệu vào cơ sở dữ liệu.
Ở đây, chúng ta sẽ mở rộng ví dụ đó bằng cách thực hiện Prepared Statement.
Bạn có thể sử dụng cùng một biểu mẫu HTML, nhưng chỉ cần đảm bảo rằng bạn đang sử dụng tên tệp chính xác trong thuộc tính action của biểu mẫu.
Đây là mã PHP được cập nhật để chèn dữ liệu. Nếu bạn xem ví dụ một cách cẩn thận, bạn sẽ thấy chúng tôi đã không sử dụng mysqli_real_escape_opes() để làm sạch dữ liệu đầu vào của người dùng, giống như chúng ta đã làm trong ví dụ chương trước.
Vì trong các câu lệnh đã chuẩn bị, dữ liệu đầu vào vào của người dùng không bao giờ được thay thế trực tiếp vào chuỗi truy vấn, do đó chúng không cần phải được làm sạch.
Hướng dẫn nhận dữ liệu thông qua Form HTML và sử dụng Prepared Statement với MySQLi hướng thủ tục
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
// Chuẩn bị câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
// Liên kết biến với tham số trong câu lệnh đã chuẩn bị
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
// Thiết lập tham số
$first_name = $_REQUEST['first_name'];
$last_name = $_REQUEST['last_name'];
$email = $_REQUEST['email'];
// Cố gắng thực hiện câu lệnh đã chuẩn bị
if(mysqli_stmt_execute($stmt)){
echo "Chèn bản ghi thành cồng.";
} else{
echo "ERROR: Không thể thực thi truy vấn: $sql. " . mysqli_error($link);
}
} else{
echo "ERROR: Không thể chuẩn bị truy vấn: $sql. " . mysqli_error($link);
}
// Đóng câu lệnh
mysqli_stmt_close($stmt);
// Đóng kết nối
mysqli_close($link);
?>
Hướng dẫn nhận dữ liệu thông qua Form HTML và sử dụng Prepared Statement với MySQLi hướng đối tượng
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
}
// Chuẩn bị câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
if($stmt = $mysqli->prepare($sql)){
// Liên kết biến với tham số trong câu lệnh đã chuẩn bị
$stmt->bind_param("sss", $first_name, $last_name, $email);
// Thiết lập tham số
$first_name = $_REQUEST['first_name'];
$last_name = $_REQUEST['last_name'];
$email = $_REQUEST['email'];
// Cố gắng thực hiện câu lệnh đã chuẩn bị
if($stmt->execute()){
echo "Chèn bản ghi thành công.";
} else{
echo "ERROR: Không thể thực thi truy vấn: $sql. " . $mysqli->error;
}
} else{
echo "ERROR: Không thể chuẩn bị truy vấn: $sql. " . $mysqli->error;
}
// Đóng câu lệnh
$stmt->close();
// Đóng kết nối
$mysqli->close();
?>
Lưu ý: Mặc dù làm sạch dữ liệu đầu vào là không bắt buộc trong Prepared Statement, bạn phải luôn xác thực loại và kích thước của dữ liệu nhận được từ các nguồn bên ngoài và thực thi các giới hạn phù hợp để bảo vệ lại các hành động khai thác tài nguyên hệ thống có hại.
Hướng dẫn nhận dữ liệu thông qua Form HTML và sử dụng Prepared Statement với PDO
<?php
/* Cố gắng kết nối máy chủ MySQL. Giả sử bạn đang chạy MySQL
Máy chủ có cài đặt mặc định (user là 'root' và không có mật khẩu) */
try{
$pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
// Thiết lập PDO erorr thành Ngoại lệ
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi câu lệnh INSERT
try{
// Chuẩn bị câu lệnh INSERT
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
$stmt = $pdo->prepare($sql);
// Ràng buộc tham số
$stmt->bindParam(':first_name', $_REQUEST['first_name'], PDO::PARAM_STR);
$stmt->bindParam(':last_name', $_REQUEST['last_name'], PDO::PARAM_STR);
$stmt->bindParam(':email', $_REQUEST['email'], PDO::PARAM_STR);
// Thực thi câu lệnh đã chuẩn bị
$stmt->execute();
echo "Chèn bản ghi thành công.";
} catch(PDOException $e){
die("ERROR: Không thể chuẩn bị / thực thi truy vấn: $sql. " . $e->getMessage());
}
// Đóng câu lệnh
unset($stmt);
// Đóng kết nối
unset($pdo);
?>
Bạn đã hiểu về Prepared Statement chưa?
Việc sử dụng Prepared Statement mang lại cho chúng ta nhiều lợi ích khi lập trình web. Đây là cách thực tế các lập trình viên hay làm để đảm bảo website đạt được sự an toàn và hiệu suất tốt.
Hãy ghi nhớ cách triển khai Prepared Statement bằng cả 3 cách, bạn chắc chắn sẽ cần nhiều đến chúng.