2017-10-01 11 views
1

Je crée une recherche utilisateur dans laquelle un utilisateur peut rechercher d'autres utilisateurs en fonction du nom d'utilisateur, de la langue et/ou de l'emplacement. Au moins un champ est requis. Par exemple, vous pouvez rechercher uniquement le nom d'utilisateur, le nom d'utilisateur et l'emplacement.Création d'une requête MYSQL avec plusieurs champs de recherche facultatifs

J'ai des difficultés à écrire une requête MYSQL qui prend en compte le fait que certains paramètres peuvent être vides. Je l'ai essayé d'utiliser un maximum de deux paramaters au moment:

PHP/MYSQL (AOP)

$data = json_decode(file_get_contents("php://input")); 
$user = $data->user; //'null' if left blank 
$location = $data->location; //'null' if left blank 


$sql = "SELECT user, spokenLanguages, profileImage 
     FROM users WHERE user LIKE :user 
     AND (town = LOWER(:location) OR country = LOWER(:location))"; 

Cela fonctionne parfaitement si l'utilisateur $ et l'emplacement de $ sont définis, mais je ne ai besoin de l'endroit où clause incluse si $ user est défini et $ location n'est pas égal à null. De même, si $ location est défini et $ user est null, la clause utilisateur ne doit pas être prise en compte. Y at-il une méthode rapide de faire cela que je ne connais pas? Ou sera-ce un cas d'extension de la requête avec une instruction if/else?

Toute aide sera appréciée.

+1

[Comment créer une clause WHERE pour PDO dynamique] (https://phpdelusions.net/pdo_examples/dynamical_where –

Répondre

2

Il est peut-être préférable de construire différentes requêtes en fonction des conditions définies. Cela rend plus facile de les optimiser.

Si vous voulez mettre la logique en une seule requête, je pense que vous voulez:

WHERE (:user IS NULL OR user LIKE :user) AND 
     (:location IS NULL OR LOWER(:location) IN (town, country)) 
+0

Vous voulez dire, une requête pour chaque combinaison possible de ce qui pourrait être défini? –