我想通过 AJAX(到 PHP 后端)向我的数据库发出查询。我有 4 个表:Company、Users、Invoices、Invoice_Lines。重要关系如下:
Users.Company_ID -> Companies.ID
Invoices.Company_ID -> Companies.ID
Invoice_Lines.Invoice_ID -> Invoices.ID
我用 PHP 编写了一个简单的解析器,它将提交的 SQL 查询分解为其组件(列、表和条件)。
我希望用户能够直接编写查询,但在将它们提交到 SQL 服务器之前对其进行修改,以便所有信息都受到登录用户的公司 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 表达式)。