Utilisez des crochets dans votre requête pour regrouper logiquement les éléments de votre clause WHERE.
WHERE name = 'abc' AND (value = 12 OR 1=1)
Si vous essayez de fournir une requête qui accepte deux variables et que vous effectuez des recherches basées sur ces variables, vous n'êtes que légèrement décalé dans votre logique.
Avec les deux variables fournies
En supposant que nous ayons deux variables @incoming_name
et @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)
Cela vous donnera
1 abc 12
Avec une variable fournie
Ensuite, si l'utilisateur fournit NULL pour l'une de ces valeurs, il les ignorera dans votre recherche.
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)
Cela vous donne toujours le résultat attendu
1 abc 12
Aucune variable fournie
Si l'utilisateur ne fournit aucune des variables pour affiner la recherche
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)
Vous obtiendrez tous les résultats du tableau
1 abc 12
2 def 13
4 mkg 14
5 pcr 10
Utiliser des variables dans votre script
En utilisant cette méthode, vous n'avez pas à SET
noms de variables dans MySQL, c'était juste à des fins de démonstration. Vous pouvez également mettre la valeur de votre code/script dans d'autres langues. Par exemple, en utilisant PHP et PDO Prepared Statements
SELECT * FROM table1
WHERE (:incoming_name = name OR :incoming_name IS NULL)
AND (:incoming_value = value OR :incoming_value IS NULL)
Ensuite, vous pouvez lier vos variables utilisateur à :incoming_name
et :incoming_value
et il recherchera comme prévu. Si l'un ou l'autre est nul, il les ignorera, sinon ils seront requis dans la recherche.
Avertissement : Je n'ai pas testé ce code, c'est juste pour vous donner une idée approximative de son fonctionnement. Il utilise PHPs PDO et les déclarations préparées comme documenté ici .
$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);
}
}
Vous devez lier chaque paramètre de la requête avec un nom distinct, c'est pourquoi lorsque nous voulons le même paramètre deux fois, nous devons lui donner un nom distinct (incoming_value1
et incoming_value2
)