Använd parenteser i din fråga för att gruppera dina WHERE-klausulobjekt logiskt.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Om du försöker tillhandahålla en fråga som accepterar två variabler, och sökningar baserat på dessa variabler, har du bara lite fel i din logik.
Med båda variablerna tillhandahållna
Förutsatt att vi har två variabler @incoming_name
och @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)
Detta ger dig
1 abc 12
Med en variabel tillhandahållen
Om användaren sedan anger NULL för något av dessa värden, hoppar den över dem i din sökning.
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)
Detta ger dig fortfarande det förväntade resultatet
1 abc 12
Utan inga variabler tillhandahållna
Om användaren inte anger någon av variablerna för att begränsa sökningen
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)
Du får alla resultat från tabellen
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Använda variabler i ditt skript
Med den här metoden behöver du inte SET
variabelnamn i MySQL, det var bara för demonstrationsändamål. Du kan lägga värdet från din kod/skript på andra språk också. Till exempel att använda PHP och PDO Prepared Statements
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Sedan kan du binda dina användarvariabler till :incoming_name
och :incoming_value
och det kommer att söka som du förväntar dig. Om någon av dem är null kommer den att hoppa över dem, annars krävs de i sökningen.
Varning: Jag har inte testat den här koden, det är bara för att ge dig en ungefärlig uppfattning om hur det skulle fungera. Den använder PHP:s PDO och förberedda uttalanden som dokumenteras här .
$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);
}
}
Du måste binda varje param i frågan med ett separat namn, vilket är anledningen till att när vi vill ha samma param två gånger måste vi ge den ett separat namn (incoming_value1
och incoming_value2
)