AJAX (PHP バックエンド) 経由でデータベースにクエリを発行したいと考えています。Company、Users、Invoices、Invoice_Lines の 4 つのテーブルがあります。重要な関係は次のとおりです。
Users.Company_ID -> Companies.ID
Invoices.Company_ID -> Companies.ID
Invoice_Lines.Invoice_ID -> Invoices.ID
送信された SQL クエリをコンポーネント (列、テーブル、および条件) に分割する単純なパーサーを PHP で作成しました。
ユーザーがクエリを直接記述できるようにしたいのですが、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 式)。