Użyj nawiasów w zapytaniu, aby logicznie pogrupować elementy klauzuli WHERE.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Jeśli próbujesz podać zapytanie, które akceptuje dwie zmienne i wyszukiwania oparte na tych zmiennych, Twoja logika jest tylko nieznacznie chybiona.
Po podaniu obu zmiennych
Zakładając, że mamy dwie zmienne @incoming_name
i @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)
To da ci
1 abc 12
Z jedną dostarczoną zmienną
Następnie, jeśli użytkownik poda NULL dla którejkolwiek z tych wartości, pominie je podczas wyszukiwania.
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)
To nadal daje oczekiwany wynik
1 abc 12
Bez zmiennych
Jeśli użytkownik nie poda żadnej ze zmiennych, aby zawęzić wyszukiwanie
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)
Otrzymasz wszystkie wyniki z tabeli
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Korzystanie ze zmiennych w skrypcie
Używając tej metody nie musisz SET
nazwy zmiennych w MySQL, to tylko w celach demonstracyjnych. Możesz umieścić wartość ze swojego kodu/skryptu również w innych językach. Na przykład za pomocą przygotowanych wyciągów PHP i PDO
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Następnie możesz powiązać zmienne użytkownika z :incoming_name
i :incoming_value
i będzie wyszukiwać zgodnie z oczekiwaniami. Jeśli któryś z nich jest pusty, pominie je, w przeciwnym razie będą wymagane w wyszukiwaniu.
Ostrzeżenie: Nie testowałem tego kodu, to tylko przybliżenie, jak to działa. Używa PHP PDO i przygotowanych instrukcji, jak udokumentowano tutaj .
$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);
}
}
Musisz powiązać każdy parametr w zapytaniu z osobną nazwą, dlatego gdy chcemy dwa razy ten sam parametr, musimy nadać mu osobną nazwę (incoming_value1
i incoming_value2
)