我正在使用PHP中的原始SQL。使用可选参数构建语句的好方法是什么?例如,我需要使用性别,年龄和来源等条件过滤用户个人资料。以什么形式传递这些参数最好?
这是我目前的做法:
$params = "";
if( isset($_GET["gender"]) ){
$gender = "";
switch( $_GET["gender"] ){
case "male":
$gender = " WHERE users.gender = 1 ";
break;
case "female":
$gender = " WHERE users.gender = 0 ";
break;
}
$params = $params + $gender;
}
答案 0 :(得分:2)
你可以使用where子句:
where (:gender is null or gender = :gender) ...
当用户没有为您提供参数时,您会传递null
。
答案 1 :(得分:2)
如果您决定使用原始SQL,则可以使用自己非常简单的查询构建器。
有许多库可以帮到您,但基本原则是创建一个知道“基本查询”的对象,然后在该对象上设置一系列参数。然后编写一个构建SQL的方法根据这些参数声明。
这可能就像设置一个子句数组一样简单,然后用它们之间的“AND”语句对它们进行内爆......
答案 2 :(得分:2)
一种可能适合您的简单方法:
1 - 用“1 = 1”开始你的WHERE子句,这样你的所有条件都可以简单地通过“AND FIELD =:PARAM”,而不是担心是否已经添加了“WHERE”这个词
2 - 使用ISNULL()构建一个基本上忽略未提供参数的查询。
示例:
SELECT *
FROM MY_TABLE t
WHERE 1=1
AND (t.gender = ISNULL(:gender,t.gender))
AND (t.age >= ISNULL(:age,t.age))
答案 3 :(得分:1)
在你给出的例子中,我可能会做类似的事情:
$params = $params . " WHERE `users`.`gender` = "
. ($_GET["gender"] == "female" ? "0" : "1");
在真正可选参数的情况下,我通常会这样做:
if (isset($_GET["gender"]))
{
$params = $params . " WHERE `users`.`gender` = "
. ($_GET["gender"] == "female" ? "0" : "1");
}