Gebruik haakjes in uw zoekopdracht om uw WHERE-componentitems logisch te groeperen.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Als u een zoekopdracht probeert te geven die twee variabelen accepteert, en zoekt op basis van die variabelen, zit u er maar een klein beetje naast.
Met beide variabelen geleverd
Ervan uitgaande dat we twee variabelen hebben @incoming_name
en @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)
Dit geeft je
1 abc 12
Met één variabele meegeleverd
Als de gebruiker vervolgens NULL opgeeft voor een van deze waarden, zal hij deze overslaan in uw zoekopdracht.
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)
Dit geeft je nog steeds het verwachte resultaat
1 abc 12
Zonder opgegeven variabelen
Als de gebruiker geen van beide variabelen opgeeft om de zoekopdracht te verfijnen
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)
U krijgt alle resultaten uit de tabel
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Vabelen gebruiken in je script
Met deze methode hoeft u niet te SET
variabelenamen in MySQL, dat was alleen voor demonstratiedoeleinden. Je kunt de waarde van je code/script ook in andere talen zetten. Bijvoorbeeld met behulp van PHP en PDO voorbereide Statments
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Vervolgens kunt u uw gebruikersvariabelen binden aan :incoming_name
en :incoming_value
en het zal zoeken zoals u verwacht. Als een van beide nul is, worden ze overgeslagen, anders zijn ze vereist bij het zoeken.
Waarschuwing: Ik heb deze code niet getest, het is alleen om je een idee te geven van hoe het zou werken. Het gebruikt PHP's BOB en voorbereide verklaringen zoals hier gedocumenteerd .
$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);
}
}
Je moet elke parameter in de query binden met een aparte naam, daarom moeten we, wanneer we dezelfde parameter twee keer willen hebben, een aparte naam geven (incoming_value1
en incoming_value2
)