2013-03-01 69 views
1

我想通過AJAX向PHP數據庫發送查詢(到PHP後端)。我有4個表格:公司,用戶,發票,發票。最重要的關係如下:如何將條件插入SQL SELECT?

Users.Company_ID -> Companies.ID 
Invoices.Company_ID -> Companies.ID 
Invoice_Lines.Invoice_ID -> Invoices.ID 

我已經用PHP編寫一個簡單的解析器會分手提交的SQL查詢到它的組件(列,表和條件)。

我希望用戶能夠直接編寫查詢了,但讓所有的信息由登錄用戶的公司ID的限制,他們提交給SQL Server之前對其進行修改。例如:

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的一個子集(與別名直接表列,左,表和別名和簡單表達哪裏內部連接)。

+1

橡膠迴避這裏大多是?不知道我得到了真正的問題 - 似乎你描述瞭解決方案。我做過類似的項目很多次,發現其爲「SQL」一個面向對象的接口可能是有用的。 ['Zend_Db_Select'](http://framework.zend.com/manual/1。12/en/zend.db.select.html)。主要的好處是,可以根據'from'和'joins'構建完整的SQL語句,然後根據查詢中使用的實際列,只加入它所需的內容。 – ficuscr 2013-03-01 19:10:25

+0

我知道輸入和輸出,但我在分析部分遇到問題。我可以手動爲任何查詢做到這一點,但我無法想象將爲我轉換它的一般算法。我可能最終會添加一大堆INNER JOIN。 – Martin 2013-03-01 19:16:41

回答

0

此外,我建議在看Zend框架如何去描述關於SQL語句在OP的方式與Zend_Db_Select

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)您將允許用戶選擇列(最終我想象的約束太) - 使用數組可能被交換出去的對象理所當然的。

$fields = array(
    'table1' => array(array('col1'/*actual field name*/ => 'col1_Alias' /*assigned alais*/), array('col2'=>'col2_Alias') 
    'table2' => array(array('col1'=>'col1_Alias'), array('col2'=>'col2_Alias') 
    etc... 
); 

定義控制器上,使用它你給用戶時,他們正在構建的查詢選項。然後使用它的時候,他們提交他們的選擇,以打造出來的SQL ...

僞上下的代碼...

foreach ($selectColumns as $table => $col) { 
    $cols[] = "{$table}.{$col['field']} AS {$col['alias']}"; 
} 

在這種循環中,您可以跟蹤每個表中引用也許決定是否需要它在您執行的SQL語句中。需要說明的性質中的聯接,雖然這樣做正確 - 再次輸入的類似Zend_Db_Select對象的OOP能力。

上沒多少肉在我的答案,但希望它幫助。