如何根据用户的选择动态生成SQL查询?

时间:2010-01-11 08:42:21

标签: php mysqli

我需要创建一个GUI,用户可以使用该GUI选择几个属性,这些属性将用于查询数据库以查找合适的人员。我正在寻找如何根据用户的选择动态生成数据库查询的想法。

查询将包含几个字段,但为了得到这个想法,我将仅包含以下三个字段作为示例:

  • 职业 - 可以有0到n个占用字符串。如果给出了职业字符串,其中一个必须匹配。

  • 年龄 - 年龄可以是:

    1. 完全匹配(30)
    2. 范围(例如30-40)
    3. 小于值(-40)
    4. 超过值(30 - )

Age参数在查询中是可选的。此外,用户可以指定年龄是否为必需参数。如果不是必需的,并且没有年龄的人是他/她的个人资料,则此人的年龄标准将被忽略。

  • 身高 - 与年龄相似

示例查询:

没有给出任何标准:

select * from persons

只有职业:

select * from persons where occupation = 'dentist'

已经举办了几项职业:

select * from persons where (occupation = 'dentist' or occupation = 'engineer')

年龄已经大于值,并且需要存在于个人资料中:

select * from persons where age >= 30

高度已作为范围给出,并且不需要存在于个人资料中:

select * from persons where (height is null or (height >= 30 and height <= 40))

不同标准的组合:

select * from persons where occupation = 'dentist' and age >= 30 and (height is null or (height >= 30 and height <= 40))

我已经实现了能够以字符串形式生成查询的代码,但它确实不太漂亮。我正在寻找能够实现这一目标的最有效和最有效的方法。

3 个答案:

答案 0 :(得分:3)

尝试Zend_Db_Select之类的内容。它提供了一个(流畅的)接口,用于生成查询并为您处理语法创建,例如

$select = $db->select();
$select->from( /* ...specify table and columns... */ )
       ->where( /* ...specify search criteria... */ )
       ->where( /* ...specify other criteria... */ )
       ->order( /* ...specify sorting criteria... */ );

我最近的一个项目中有一个类似的要求,其中用户的配置文件包含自动应用于数据库中某些表的过滤条件,从而限制了用户可以看到的内容,例如,固定客户限制产品但仍允许通过GUI进行动态过滤,例如对于产品类别。

我通过让我的模型返回一个基本查询然后通过装饰器运行这个基本查询来解决它,该装饰器将应用用户在其配置中的所有条件,例如( faux code )。

    request = Request->getParams()            // selection criteria set from GUI
    sql     = Products->getBaseQuery(request) // basic query for requested View
    sql     = Decorator->applyUserConfig(sql) // custom fixed user filter
    results = sql->execute()

答案 1 :(得分:2)

这不会直接回答你的问题,但这里有一点提示,而不是像这样写你的查询:

select * from persons where (occupation = 'dentist' or occupation = 'engineer')

试试这个:

select * from persons where occupation IN ('dentist','engineer')

这样可以更容易阅读并轻松生成PHP脚本。

答案 2 :(得分:0)

看起来你可以生成有限数量的查询,所以我建议用参数编写这些查询,然后使用选择逻辑来确定调用和设置参数值。