Trong các truy vấn SQL, mệnh đề WHERE được sử dụng để lọc dữ liệu dựa trên các điều kiện cụ thể. Mệnh đề này thường được dùng trong các truy vấn SELECT, UPDATE, DELETE để chỉ lấy những bản ghi thỏa mãn điều kiện.
Trong PHP, bạn có thể sử dụng mysqli hoặc PDO để thực hiện truy vấn MySQL với mệnh đề WHERE. Bài viết này sẽ hướng dẫn bạn cách sử dụng mệnh đề WHERE trong các truy vấn SQL với cả hai phương pháp.
1. Sử dụng mysqli với mệnh đề WHERE
a) Hướng đối tượng (OOP)
Trong ví dụ này, chúng ta sẽ sử dụng mysqli để lấy dữ liệu từ cơ sở dữ liệu và chỉ những bản ghi thỏa mãn điều kiện WHERE.
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Câu lệnh SQL sử dụng mệnh đề WHERE
$sql = "SELECT id, username, email FROM Users WHERE username = 'john_doe'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Lặp qua các bản ghi kết quả
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
$conn->close();
?>Giải thích:
WHERE username = 'john_doe': Chỉ lấy những bản ghi có tên người dùng là "john_doe".$result->num_rows: Kiểm tra xem có bao nhiêu bản ghi thỏa mãn điều kiện.$result->fetch_assoc(): Lấy từng bản ghi và hiển thị các giá trị từ cộtid,username, vàemail.
b) Hướng thủ tục
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if (!$conn) {
die("Kết nối thất bại: " . mysqli_connect_error());
}
// Câu lệnh SQL sử dụng mệnh đề WHERE
$sql = "SELECT id, username, email FROM Users WHERE username = 'jane_doe'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// Lặp qua các bản ghi kết quả
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
mysqli_close($conn);
?>Giải thích:
mysqli_query(): Thực hiện truy vấn SQL vớimysqlitheo hướng thủ tục.mysqli_fetch_assoc(): Trả về kết quả của từng bản ghi dưới dạng mảng kết hợp.
2. Sử dụng PDO với mệnh đề WHERE
Ví dụ với PDO
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Câu lệnh SQL sử dụng mệnh đề WHERE
$stmt = $conn->prepare("SELECT id, username, email FROM Users WHERE username = :username");
$stmt->bindParam(':username', $username);
// Gán giá trị cho biến
$username = 'john_doe';
// Thực thi câu lệnh
$stmt->execute();
// Lấy kết quả trả về dưới dạng mảng kết hợp
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($stmt->rowCount() > 0) {
foreach ($result as $row) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} else {
echo "Không có kết quả.";
}
} catch(PDOException $e) {
echo "Lỗi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
prepare(): Chuẩn bị câu lệnh SQL với tham số placeholder (:username).bindParam(): Liên kết biến PHP với tham số placeholder trong câu lệnh SQL.fetchAll(PDO::FETCH_ASSOC): Lấy tất cả các bản ghi dưới dạng mảng kết hợp.rowCount(): Trả về số lượng bản ghi được trả về từ truy vấn.
3. Sử dụng WHERE với các toán tử
Mệnh đề WHERE có thể sử dụng với nhiều toán tử khác nhau để lọc dữ liệu theo nhiều điều kiện khác nhau.
a) Sử dụng toán tử so sánh (=, !=, <, >, <=, >=)
$sql = "SELECT id, username, email FROM Users WHERE id > 5";Câu lệnh này sẽ lấy tất cả các bản ghi có id lớn hơn 5.
b) Sử dụng toán tử LIKE cho tìm kiếm mẫu
$sql = "SELECT id, username, email FROM Users WHERE email LIKE '%@example.com'";Câu lệnh này sẽ lấy tất cả các bản ghi mà cột email kết thúc với "@example.com".
c) Sử dụng toán tử IN để kiểm tra nhiều giá trị
$sql = "SELECT id, username, email FROM Users WHERE username IN ('john_doe', 'jane_doe')";Câu lệnh này sẽ lấy các bản ghi có username là "john_doe" hoặc "jane_doe".
d) Sử dụng toán tử BETWEEN cho phạm vi giá trị
$sql = "SELECT id, username, email FROM Users WHERE id BETWEEN 5 AND 10";Câu lệnh này sẽ lấy tất cả các bản ghi có id nằm trong khoảng từ 5 đến 10.
4. Sử dụng Prepared Statements với mệnh đề WHERE
Prepared Statements giúp bảo mật dữ liệu khi thực hiện truy vấn với mệnh đề WHERE, ngăn chặn SQL Injection. Dưới đây là cách sử dụng Prepared Statements với mysqli và PDO.
a) Sử dụng Prepared Statements với mysqli
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Chuẩn bị câu lệnh SQL
$stmt = $conn->prepare("SELECT id, username, email FROM Users WHERE username = ?");
$stmt->bind_param("s", $username);
// Gán giá trị và thực thi câu lệnh
$username = "john_doe";
$stmt->execute();
// Liên kết kết quả
$stmt->bind_result($id, $username, $email);
// Hiển thị kết quả
while ($stmt->fetch()) {
echo "ID: $id - Username: $username - Email: $email<br>";
}
// Đóng câu lệnh và kết nối
$stmt->close();
$conn->close();
?>b) Sử dụng Prepared Statements với PDO
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Chuẩn bị câu lệnh SQL
$stmt = $conn->prepare("SELECT id, username, email FROM Users WHERE username = :username");
$stmt->bindParam(':username', $username);
// Gán giá trị và thực thi câu lệnh
$username = 'john_doe';
$stmt->execute();
// Lấy kết quả
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Hiển thị kết quả
foreach ($result as $row) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} catch(PDOException $e) {
echo "Lỗi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
- Prepared Statements giúp bảo mật dữ liệu đầu vào khi thực hiện truy vấn SQL, tránh tấn công SQL Injection.
- PDO và mysqli đều hỗ trợ sử dụng Prepared Statements để xử lý các câu truy vấn với mệnh đề
WHERE.
5. Kết luận
Mệnh đề WHERE trong SQL là một công cụ mạnh mẽ để lọc dữ liệu từ cơ sở dữ liệu MySQL dựa trên các điều kiện cụ thể. Trong PHP, bạn có thể sử dụng mệnh đề WHERE với cả mysqli và PDO để truy vấn dữ liệu theo các điều kiện bạn muốn.
mysqli: Phù hợp cho các dự án sử dụng MySQL với cả hai hướng lập trình: thủ tục và hướng đối tượng.- PDO: Cung cấp khả năng linh hoạt hơn, hỗ trợ nhiều hệ quản trị cơ sở dữ liệu và chỉ hỗ trợ hướng đối tượng.
Việc sử dụng Prepared Statements là một cách hiệu quả để bảo vệ ứng dụng khỏi SQL Injection và giúp xử lý dữ liệu an toàn hơn khi làm việc với các tham số trong truy vấn SQL.









