2013-08-01 5 views
0

J'ai une méthode PHP avec un certain nombre de paramètres, qui sont tous facultatifs. Une requête SQL utilise ces paramètres pour sélectionner dans une base de données des employés où chaque paramètre est comme une compétence/rôle. Il ressemble à ceci:Comment créer une requête SQL SELECT avec des paramètres optionnels

getMedicalStaff($active = 1, $consultant = 0, $ana = 0, $outreach = 0, $prescribedBy = 0, $respiteCare = 0) 

Quelle est la meilleure façon de créer une requête SQL pour sélectionner les lignes à partir d'une base de données en tenant compte de chaque paramètre peut ou non être nécessaire? Je suis conscient qu'il serait théoriquement possible d'appeler cette méthode et de ne rien demander, mais dans la pratique, il est peu probable que cela se produise.

J'ai essayé quelques méthodes différentes, mais aucune ne fonctionne correctement. Ma première tentative a été quelque chose comme ceci:

// Build query 
$argActive = ($active == 1) ? 'true' : 'false'; 

SELECT * FROM MedStaff WHERE Active = $argActive 

Mais ceci est évidemment imparfaite, car elle demande certains champs soient explicitement faux lorsque leur valeur n'a pas d'importance.

La prochaine chose que j'ai essayé construisais la requête SQL comme ceci:

$argActive = (active == 1) ? 'active = true' : ''; 

Mais je dois déconner combler les lacunes entre chaque variable d'arguments avec et sans savoir si effectivement la prochaine variable d'arguments contenait quelque chose ou non.

J'ai aussi essayé ceci:

$argActive = ($active == 1) ? '= true' : 'IS NULL'; 

$sql = "SELECT * FROM MedStaff WHERE Active $argActive 

Le problème est que je ne peux pas garantir les champs de base de données sont explicitement même NULL si elles sont « vides » (j'ai hérité la conception de base de données) donc cela ne semblent fonctionner.

Quelle est la meilleure façon de résoudre mon dilemme? Cela ressemble à un problème qui a été rencontré à plusieurs reprises et qui doit avoir une réponse standard acceptée, mais je n'ai pas réussi à trouver celui qui a fonctionné dans mon Google.

+1

Je vois que vous déjà accepté une réponse, mais au lieu d'avoir tous ces paramètres que vous pourriez aussi avoir un paramètre ce qui serait un tableau associatif. Est plus simple. – Pablo

Répondre

1

Utilisez un tableau de conditions:

$wheres = array(); 
if ($active) { 
    $wheres[] = 'active = true'; 
} 
if ($consultant) 
    $wheres[] = 'consultant = true'; 
} 

ensuite les combiner avec implode():

$where_string = implode(' AND ', $wheres); 

$sql = "SELECT * FROM MedStaff"; 
if ($where_string) { 
    $sql .= " WHERE " . $where_string; 
} 
+0

Fonctionne comme un charme, merci beaucoup! – Roy

Questions connexes