我正在开发一个用PHP / MySQL开发的问题管理系统。 它需要搜索功能,用户将提及搜索参数,并根据这些参数,系统将返回结果集。
要解决这个问题,我正在尝试编写一个函数,并且所有用户选择的参数都作为参数传递。根据参数,我将动态生成查询。有时(基于用户做出的选择)这些参数中的一个或多个可以为空。
示例查询:
select * from tickets inner join ticket_assigned_to on tickets.id=ticket_assigned_to.ticket_id where tickets.project_id= in ('') and tickets.status in ('') and ticket_assigned_to.user_id in ('') and tickets.reporter_user_id='' and tickets.operator_user_id in ('') and tickets.due_date between '' and '' and tickets.ts_created between '' and '';
我还需要处理在查询中可以对参数进行OR运算或AND运算的情况。
例如:
select * from tickets inner join ticket_assigned_to on tickets.id=ticket_assigned_to.ticket_id where tickets.project_id= in ('') and tickets.status in ('') or tickets.due_date = '' or tickets.ts_created between '' and '';
我也计划在项目的其他地方使用相同的功能。 喜欢显示用户的所有门票或在给定日期之间创建的所有门票等等......
如何处理这种情况?
我应该使用单一功能来处理所有这些或许多小功能吗?
需要指导。
答案 0 :(得分:1)
我不认为直接将用户搜索查询转换为mysql查询是一个好主意。基本上你只是变得更容易受到SQL注入。
我建议使用像PHP ActiveRecord这样的抽象层,搜索可能是Sphinx这样的全文搜索引擎,它有自己的高级查询模式,您可以通过@author Peter
进行查询或Sam | Martha
。
答案 1 :(得分:1)
如何使用Specification Pattern来构建查询条件?
链接不是特定于PHP的,但希望能说明如何构建WHERE
标准:
LINQ expression trees & the Specification pattern
C# Specification Pattern Example
Google图书搜索结果 - Jason Sweat's Guide to PHP Design Patterns
Learn the Specification Pattern