如何使用可选参数创建SQL SELECT查询

时间:2013-08-01 10:21:25

标签: php sql optional-parameters

我有一个带有许多参数的PHP方法,所有参数都是可选的。 SQL查询使用这些参数从员工数据库中进行选择,其中每个参数都像技能/角色。它看起来像这样:

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

创建SQL查询以从数据库中选择行的最佳方法是什么?记住每个参数可能需要也可能不需要?我知道理论上可以称这种方法并不要求任何东西,但在实践中不太可能发生。

我尝试过几种不同的方法,但都没有正常工作。我的第一次尝试是这样的:

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

SELECT * FROM MedStaff WHERE Active = $argActive 

但这显然是有缺陷的,因为当它们的价值无关紧要时,它会要求某些字段明确为假。

我接下来尝试的是构建SQL查询,如下所示:

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

但是接下来我不得不乱用每个参数变量与AND之间的间隙,而不知道下一个参数变量是否实际包含任何东西。

我也试过这个:

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

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

问题是我无法保证数据库字段显式为NULL,即使它们是空的' (我继承了数据库设计)所以这似乎不起作用。

解决我的困境的最佳方法是什么?这感觉就像以前遇到过的问题一样,并且必须有一个标准的接受答案,但是我找不到一个在Google搜索中有用的问题。

1 个答案:

答案 0 :(得分:1)

使用一系列条件:

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

然后将它们与implode()

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

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