Php 如何将条件插入到SQL SELECT中?

Php 如何将条件插入到SQL SELECT中?,php,mysql,Php,Mysql,我想通过AJAX向我的数据库发出一个查询(到PHP后端)。我有4个表格:公司、用户、发票、发票行。重要关系如下: Users.Company_ID -> Companies.ID Invoices.Company_ID -> Companies.ID Invoice_Lines.Invoice_ID -> Invoices.ID 我用PHP编写了一个简单的解析器,它将提交的SQL查询分解为组件(列、表和条件) 我希望用户能够直接编写查询,但在将查询提交到SQL server之

我想通过AJAX向我的数据库发出一个查询(到PHP后端)。我有4个表格:公司、用户、发票、发票行。重要关系如下:

Users.Company_ID -> Companies.ID
Invoices.Company_ID -> Companies.ID
Invoice_Lines.Invoice_ID -> Invoices.ID
我用PHP编写了一个简单的解析器,它将提交的SQL查询分解为组件(列、表和条件)

我希望用户能够直接编写查询,但在将查询提交到SQL server之前对其进行修改,以便所有信息都受到登录用户的公司ID的限制。例如:

SELECT Users.ID, Users.Name, Users.Email
FROM Users
我希望查询变成:

SELECT Users.ID, Users.Name, Users.Email
FROM Users
WHERE Users.Company_ID = X
在更复杂的示例中:

SELECT Invoice_Lines.Subtotal
FROM Invoice_Lines
WHERE Invoice_Lines.Invoice_ID = 4
变成

SELECT Invoice_Lines.Subtotal
FROM Invoice_Lines
INNER JOIN Invoices ON (Invoice_Lines.Invoice_ID = Invoice.ID)
INNER JOIN Company ON (Invoice.Company_ID = Company.ID)
WHERE Invoice_Lines.Invoice_ID = 4 AND Company.ID = X
很明显,我必须创建与语句不冲突的表别名,因为语句已经编写好了。我不确定如何分析查询,以确定限制输入的最有效方法


我打算只支持SQL的一个子集(带别名的直接表列、带表和别名的左联接和内联接以及简单的where表达式)。

同样,我建议看看Zend Framework是如何用OP方式描述SQL语句的

1) 定义包含要从中选择列的所有表的基本SQL语句

让我们说:

SELECT * 
FROM table1
LEFT JOIN table2 on table2.table1Id = table1.id
LEFT JOIN table3 on table3.table2Id = table2.id
LEFT JOIN table4 on table4.table3Id = table3.id
2) 您将允许用户选择列(最终我也会想到约束)——使用数组,当然可以将数组换成对象

在控制器上定义,将其用于用户在生成查询时提供的选项。然后在他们提交选择以构建SQL时使用它

伪ish代码

foreach ($selectColumns as $table => $col) {
     $cols[] = "{$table}.{$col['field']} AS {$col['alias']}";
}
在该循环中,您可以跟踪引用的每个表,并可能决定在将执行的SQL语句中是否需要它。但是,需要描述连接的性质才能正确地做到这一点-再次输入Zend_Db_Select之类的OOP功能


我的回答中没有太多内容,但希望能有所帮助。

主要是在这里玩橡皮鸭吗?我不确定我是否理解了真正的问题-似乎你描述了解决方案。我已经做过很多类似的项目,发现为“SQL”提供一个OOP接口是很有用的。我想到了。主要好处是,您构建完整的SQL语句,直到“from”和“joins”,然后根据查询中使用的实际列,它只根据需要进行连接。我知道输入和输出,但在分析部分遇到了问题。对于任何查询,我都可以手工完成,但我无法想象将其转换为通用算法。我可能最终会添加大量的内部联接。
foreach ($selectColumns as $table => $col) {
     $cols[] = "{$table}.{$col['field']} AS {$col['alias']}";
}