Verwenden Sie Klammern in Ihrer Abfrage, um die Elemente Ihrer WHERE-Klausel logisch zu gruppieren.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Wenn Sie versuchen, eine Abfrage bereitzustellen, die zwei Variablen akzeptiert, und auf der Grundlage dieser Variablen sucht, liegen Sie in Ihrer Logik nur geringfügig daneben.
Mit beiden bereitgestellten Variablen
Angenommen, wir haben zwei Variablen @incoming_name
und @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)
Dadurch erhalten Sie
1 abc 12
Mit einer bereitgestellten Variablen
Wenn der Benutzer dann NULL für einen dieser Werte angibt, werden sie bei Ihrer Suche übersprungen.
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)
Dadurch erhalten Sie immer noch das erwartete Ergebnis
1 abc 12
Ohne Variablen angegeben
Wenn der Benutzer keine der Variablen angibt, um die Suche einzugrenzen
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)
Sie erhalten alle Ergebnisse aus der Tabelle
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Variablen in Ihrem Skript verwenden
Bei dieser Methode müssen Sie nicht SET
Variablennamen in MySQL, das war nur zu Demonstrationszwecken. Sie können den Wert aus Ihrem Code/Skript auch in anderen Sprachen angeben. Zum Beispiel mit PHP und PDO Prepared Statements
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Dann können Sie Ihre Benutzervariablen an :incoming_name
binden und :incoming_value
und es wird wie erwartet gesucht. Wenn beide null sind, werden sie übersprungen, andernfalls werden sie bei der Suche benötigt.
Warnung: Ich habe diesen Code nicht getestet, er soll Ihnen nur eine ungefähre Vorstellung davon geben, wie er funktionieren würde. Es verwendet PHPs PDO und vorbereitete Anweisungen, wie hier dokumentiert .
$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);
}
}
Sie müssen jeden Parameter in der Abfrage mit einem separaten Namen binden, weshalb wir ihm einen separaten Namen geben müssen, wenn wir denselben Parameter zweimal wollen (incoming_value1
und incoming_value2
)