Gunakan tanda kurung dalam kueri Anda, untuk mengelompokkan item klausa WHERE Anda secara logis.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Jika Anda mencoba memberikan kueri yang menerima dua variabel, dan menelusuri berdasarkan variabel tersebut, logika Anda hanya sedikit menyimpang.
Dengan kedua variabel yang disediakan
Anggap kita memiliki dua variabel @incoming_name
dan @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)
Ini akan memberi Anda
1 abc 12
Dengan satu variabel yang disediakan
Kemudian jika pengguna memberikan NULL untuk salah satu dari nilai tersebut, nilai tersebut akan diabaikan dalam pencarian Anda.
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)
Ini masih memberi Anda hasil yang diharapkan
1 abc 12
Tanpa variabel yang disediakan
Jika pengguna tidak menyediakan salah satu variabel untuk mempersempit pencarian
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)
Anda akan mendapatkan semua hasil dari tabel
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Menggunakan variabel dalam skrip Anda
Dengan menggunakan metode ini Anda tidak perlu SET
nama variabel di MySQL, itu hanya untuk tujuan demonstrasi. Anda dapat memasukkan nilai dari kode/skrip Anda dalam bahasa lain juga. Misalnya menggunakan PHP dan Pernyataan yang Disiapkan PDO
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Kemudian Anda dapat mengikat variabel pengguna Anda ke :incoming_name
dan :incoming_value
dan itu akan mencari seperti yang Anda harapkan. Jika salah satunya adalah null, mereka akan melewatinya, jika tidak, mereka akan diminta dalam pencarian.
Peringatan: Saya belum menguji kode ini, ini hanya untuk memberi Anda gambaran kasar tentang cara kerjanya. Ini menggunakan PHP PDO dan pernyataan yang disiapkan seperti yang didokumentasikan di sini .
$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);
}
}
Anda perlu mengikat setiap param dalam kueri dengan nama terpisah, itulah sebabnya ketika kami menginginkan param yang sama dua kali, kami harus memberinya nama terpisah (incoming_value1
dan incoming_value2
)