Brug parenteser i din forespørgsel til at gruppere dine WHERE-klausulelementer logisk.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Hvis du forsøger at angive en forespørgsel, der accepterer to variabler, og søger baseret på disse variabler, er du kun lidt ude af din logik.
Med begge variabler leveret
Forudsat at vi har to variabler @incoming_name
og @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)
Dette vil give dig
1 abc 12
Med én variabel leveret
Så hvis brugeren angiver NULL for en af disse værdier, springer den over dem i din søgning.
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)
Dette giver dig stadig det forventede resultat
1 abc 12
Uden angivet variable
Hvis brugeren ikke angiver nogen af variablerne for at indsnævre søgningen
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 alle resultaterne fra tabellen
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Brug af variabler i dit script
Ved at bruge denne metode behøver du ikke SET
variabelnavne i MySQL, det var kun til demonstrationsformål. Du kan også sætte værdien fra din kode/script på andre sprog. For eksempel ved hjælp af PHP og PDO Prepared Statements
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Derefter kan du binde dine brugervariable til :incoming_name
og :incoming_value
og det vil søge som du forventer. Hvis en af dem er nul, springer den over dem, ellers kræves de i søgningen.
Advarsel: Jeg har ikke testet denne kode, det er bare for at give dig en ide om, hvordan den ville fungere. Den bruger PHP'er PDO og forberedte erklæringer som dokumenteret her .
$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 skal binde hver param i forespørgslen med et separat navn, hvilket er grunden til, at når vi ønsker den samme parameter to gange, skal vi give det et separat navn (incoming_value1
og incoming_value2
)