3

假设我有以下字符串(忘记它是 MySQL 语句):

SELECT * FROM users WHERE name = 'fred bloggs' AND age=21 AND address='Mountain View, CA 94043' LIMIT 1

我需要一种方法来提取 WHERE 子句中的字段名称和值,所以我有一个像这样的数组:

Array
(
    [name] => fred bloggs
    [age] => 21
    [address] => Mountain View, CA 94043
)

请记住,这是一个动态 MySQL 字符串,所以我不能硬编码姓名、年龄或地址。

我能预见的问题是:

  • 查找字段名称时,该函数必须知道所有有效的运算符才能匹配每个字段名称(请参阅下面要使用的数组)
  • 不保证空间(例如年龄=21)
  • 查找 ' 和 ' 中的值,但当 ' 在字符串中时不中断
  • 查找不在 ' 和 ' 中的值,例如数字或其他字段名称(需要单独处理)

有没有人知道如何使用正则表达式或字符串函数来做到这一点?

如果需要,这里是运算符:

$operators = array('+', '-', '*', '/', '^', '=', '<>', '!=', '<', '<=', '>', '>=', 'like', 'clike', 'slike', 'not', 'is', 'in', 'between', 'and', 'or');
4

3 回答 3

4

您可以尝试使用这种工具: http ://code.google.com/p/php-sql-parser/

你会得到一个描述查询的树(一个数组),这将帮助你构建你想要的数组。

于 2011-03-02T11:03:31.007 回答
2

你应该为此创建一个表达式解析器,它不能用 regex 来实现。例如,您的结果数组将包含一个表达式树,其中包含您指定的所有节点类型(OR、AND、IN、BETWEEN 等)。网络上有一个示例:这里

于 2011-03-02T10:42:16.853 回答
0

可能有几种方法可以解决这个问题:

1) 从查询中查找元数据。我知道您可以获得有关结果集的信息,但我不确定原始查询。它在某个地方,但可能需要梳理一下。

2) 使用准备好的语句从片段中构建查询。传入数组中的各种 where 条件。不过,它有点倒退(IE 从您想要的答案开始,然后构建查询)。

于 2011-02-24T17:28:07.110 回答