使用可选参数构建SQL语句

时间:2011-07-13 16:35:17

标签: php mysql sql build

我正在使用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;
}

4 个答案:

答案 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");
}