2010-11-19 39 views
0

我正在与一个商品销售网站,每个产品在数据库(MySQL)属于几个类别。我使用多对多表映射来存储产品类别关系。解析复杂的逻辑表达式并执行搜索,在php

ProductID CategoryID 
1   1001 
1   1002 
1   1003 
2   1001 
2   1003 
2   1005 

我认为这种方法对于按类别进行的一般产品搜索是相当直接的。

但是,内部用户将在复杂的逻辑表达式中按类别搜索产品。 例如:

输入“(1001 + 1002)| 1005”查找属于类别(1001和1002)或(1005)的产品。 输入“(1001 + 1002)|(1003 + 1004)”查找属于类别(1001和1002)或(1003和1004)的产品。

由于查询是动态的,我认为将其直接转换为SQL并不好。我的做法是检索出现在查询中ProductIDs和CategoryIDs(例如 “(1001 + 1002 | 1005)”):

SELECT ProductID, CategoryID FROM ProCatMap WHERE CategoryID IN (1001, 1002, 1005) 

然后做在PHP中最后筛选。

在我选择ProductID-CategoryID记录后,我将它们按以下格式组合成一个数组: $ Relation [$ ProductID] = array(CategoryID1,CategoryID2 .....);因此对于上面列出的数据,该阵列将是

$Relation[1] = array(1001,1002, 1003); 
$Relation[2] = array(1001, 1003, 1005); 

我的问题是,应该怎么代码来解析动态逻辑查询并做阵列上的滤波。

查询只包含AND(+)和OR(|)运算符和括号,并且括号总是平衡的。 (例如,每个开放式括号在查询中必须有一个闭括号)。

任何帮助,高度赞赏。

回答

0

老实说 - 你应该重新考虑这个方法并找出数据库为你做这种过滤的方法。这是RDBM的设计目的。在PHP(或任何通用编程语言)中做这样的事情将会重新发明,并且很可能非常容易出错。

您似乎已经将解析逻辑关闭(+和AND)将产生交集(|和OR)将产生联合。去那。

+0

Thx为您的建议。在SQL中进行过滤是完全正确的。我关心的是如何将输入查询“翻译”为SQL或一系列PHP条件,以便我可以在SQL或PHP中执行过滤。我尝试过使用RegExp,但它不能递归执行某些操作。 – LazNiko 2010-11-19 08:03:27