Sử dụng dấu ngoặc trong truy vấn của bạn để nhóm các mục mệnh đề WHERE của bạn một cách hợp lý.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Nếu bạn đang cố gắng cung cấp một truy vấn chấp nhận hai biến và tìm kiếm dựa trên những biến đó, bạn chỉ hơi sai logic của mình.
Với cả hai biến được cung cấp
Giả sử chúng ta có hai biến @incoming_name
và @incoming_value
:
SET @incoming_name = 'abc';
SET @incoming_value = 12;
SELECT * FROM table1
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)
Điều này sẽ mang lại cho bạn
1 abc 12
Với một biến được cung cấp
Sau đó, nếu người dùng cung cấp NULL cho một trong các giá trị đó, nó sẽ bỏ qua chúng trong tìm kiếm của bạn.
SET @incoming_name = 'abc';
SET @incoming_value = NULL;
SELECT * FROM table1
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)
Điều này vẫn mang lại cho bạn kết quả như mong đợi
1 abc 12
Không có biến nào được cung cấp
Nếu người dùng không cung cấp biến nào để thu hẹp tìm kiếm
SET @incoming_name = NULL;
SET @incoming_value = NULL;
SELECT * FROM table1
WHERE (@incoming_name = name OR @incoming_name IS NULL)
AND (@incoming_value = value OR @incoming_value IS NULL)
Bạn sẽ nhận được tất cả các kết quả từ bảng
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Sử dụng các biến trong tập lệnh của bạn
Sử dụng phương pháp này, bạn không phải SET
tên biến trong MySQL, chỉ dành cho mục đích trình diễn. Bạn cũng có thể đặt giá trị từ mã / tập lệnh của mình bằng các ngôn ngữ khác. Ví dụ:sử dụng các trạng thái chuẩn bị sẵn của PHP và PDO
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Sau đó, bạn có thể liên kết các biến người dùng của mình với :incoming_name
và :incoming_value
và nó sẽ tìm kiếm như bạn mong đợi. Nếu một trong hai vô hiệu, nó sẽ bỏ qua chúng, nếu không chúng sẽ được yêu cầu trong tìm kiếm.
Cảnh báo: Tôi chưa thử nghiệm mã này, nó chỉ để cung cấp cho bạn một ý tưởng sơ bộ về cách nó sẽ hoạt động. Nó sử dụng PHP PDO và các câu lệnh đã chuẩn bị sẵn như được ghi ở đây .
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("SELECT * FROM table1
WHERE (:incoming_name1 = name OR :incoming_name2 IS NULL)
AND (:incoming_value1 = value OR :incoming_value2 IS NULL)");
$stmt->bindParam(':incoming_name1', $name);
$stmt->bindParam(':incoming_name2', $name);
$stmt->bindParam(':incoming_value1', $value);
$stmt->bindParam(':incoming_value2', $value);
if ($stmt->execute()) {
while ($row = $stmt->fetch()) {
var_dump($row);
}
}
Bạn cần liên kết mỗi tham số trong truy vấn với một tên riêng biệt, đó là lý do tại sao khi chúng ta muốn cùng một tham số hai lần, chúng ta cần đặt tên riêng cho nó (incoming_value1
và incoming_value2
)