2016-08-12 61 views
0

我正在爲我的sql表創建一個搜索過濾器,我希望能夠搜索表的所有字段並返回包含我輸入的文本的記錄。我有多個表,所以硬編碼到我的聲明中的所有字段不是一個選項。這個方法我試過(見代碼片段),但我收到此錯誤:搜索sql表的所有字段時出現語法錯誤

class EOIeException with message 'Syntax error (missing operator) in query expression '(fieldContent LIKE '%SearchStr%') OR (fieldContent LIKE '%SearchStr%') OR ''. Process stopped.

通常語法錯誤很容易解決,但我沒有與這一個線索。希望你能幫助。謝謝。順便說一句,fieldContent和SearchStr只是實際內容的表示。

qryInfo.SQL.Clear; 
qryInfo.SQL.Add('SELECT * FROM ' + tableName); 
qryInfo.Open; 

tblInfo.SQL.Clear; 
tblInfo.SQL.Add('SELECT * FROM ' + tableName); 
tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].AsString + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')'); 

for i:= 1 to qryInfo.FieldCount - 1 do 
    begin 
    tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].AsString + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')'); 
    end; 
tblInfo.Open; 

tblInfo.Open之前把ShowMessage(tblInfo.Text)當我

SELECT * FROM tblGymnast 
WHERE (EG000002 LIKE '%S%') 
OR (Erasmus LIKE '%S%') 
OR (Petrus LIKE '%S%') 
OR (Peter LIKE '%S%') 
OR (EF000001 LIKE '%S%') 
OR (2 LIKE '%S%') 
OR (0832133123 LIKE '%S%') 
OR (SFEW33FWX LIKE '%S%') 
OR (- LIKE '%S%') 
OR (2016/03/08 LIKE '%S%') 
OR (1996-08-19 LIKE '%S%') 
OR (M LIKE '%S%') 
OR (Afrikaans LIKE '%S%') 
OR (White LIKE '%S%') 
OR (Trampoline LIKE '%S%') 
OR (1908966000234 LIKE '%S%') 
OR (EL000004 LIKE '%S%') 
OR (ES000002 LIKE '%S%') 
OR (EL000003 LIKE '%S%') 
OR (TR000002 LIKE '%S%') 
OR (ED000001 LIKE '%S%') 
OR (234567890 LIKE '%S%') 
OR (EM000001 LIKE '%S%') 
+0

就在'tblInfo.Open;'之前,添加'ShowMessage(tblInfo.SQL.Text);'看看你是否能得到你所期望的。另外,對SQL注入進行一些研究 - 通過使用unsanitized用戶輸入來連接SQL,您已經讓自己變得更加開放。 [小巴比表](http://littlebobbytables.com)會愛你。 –

+0

嗨,肯我編輯我的問題與ShowMessage(tblInfo.SQL.Text)的結果。它發出了正確的結果。另外,封裝在QoutedStr()中的字符串是否仍然會對SQL注入造成負面影響? @KenWhite –

+0

是的,封裝在QuotedStr()中的字符串非常容易受到SQL注入的攻擊。你讀過我給你的鏈接了嗎?你的SQL不是*發出正確的結果*。我看到您添加的SQL至少有6個問題 - 「2」,「0832133123」,「-',」2016-03/08「和」1996-08-19「,」1908966000234「和」234567890「分別是在我遇到過的任何SQL方言中沒有有效的列名稱。如果你的SQL不能在管理工具中執行,你可以運行它進行測試,它也不會在你的Delphi應用程序中運行。 –

回答

2

您的編輯之後添加生成的SQL,在你的代碼中的錯誤已經很清楚。 (生成的SQL包含無效的列名,並且在我指出它確認其實際是數據後,您的後續評論。)

您試圖檢索列名作爲使用的語句的左側值Field[i].AsString,但這是錯誤的。 TField.AsString返回字段的內容作爲字符串,而不是字段的名稱。要檢索名稱,您需要改爲使用TField.FieldName

qryInfo.SQL.Clear; 
qryInfo.SQL.Add('SELECT * FROM ' + tableName); 
qryInfo.Open; 

tblInfo.SQL.Clear; 
tblInfo.SQL.Add('SELECT * FROM ' + tableName); 
tblInfo.SQL.Add('WHERE (' + qryInfo.Fields[0].FieldName + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')'); 

for i:= 1 to qryInfo.FieldCount - 1 do 
begin 
    tblInfo.SQL.Add(' OR (' + qryInfo.Fields[i].FieldName + ' LIKE ' + QuotedStr('%' + edtSearch.Text + '%') + ')'); 
end; 
tblInfo.Open; 

我要指出的是,這個代碼是極易受到 SQL注入,因爲它盲目地使用unsanitized用戶數據來連接的SQL語句。這是一個非常糟糕的主意,因爲它會使整個數據庫處於危險之中。使用QuotedStr完全不能減少這種風險。請參閱Little Bobby Tables以瞭解有關這種安全風險的原因。

+0

謝謝你解決這個錯誤。我知道這是有勇氣的,但目前這不是我的問題。這是一個學校項目,我首先關注設計的其他方面,然後再關注注入。謝謝您的幫助。 –

+0

快速問題@Ken White,您如何使用LIKE語句(例如%)使用參數:參數% –

+0

您可以在代碼中使用':Parameter'並在'%'+ ParamValue +'%''中設置參數。 –