最近, 為了瞭解公司ERP系統的問題, 用SQL Server Profiler去看ERP系統執行的過程中有那些SQL, 結果看到一些我覺得奇怪的條件句:
SELECT ......
FROM TABLE1 A, TABLE2 B
WHERE A.AAA = B.BBB AND 1<>1
問題在那個"1<>1", 我還看到有些條件句是"1=1"或"0<>0"或"0=0"或"1=0"或"1<>0"的
為何這麼寫呢? 是為了要讓一定撈到資料或一定空資料嗎?
早期,Visual FoxPro程式設計師,很常用到SELECT....WHERE 1=1或者1>2這種寫法
記得前輩的說法是,只要取得schema,不需要把所有資料都撈出來,效能比較好。
也不需要care資料表的變動。
當然是沒有資料, 所以應該是為了取得Data Schema.
通常是為了寫程式方便。如果條件是變動的(也就是可以讓USER下條件查資料),SQL 的語法通常會寫成 WHERE FIELD1=VALUE1 AND FIELD2=VALUE2 AND ..., 但如果USER沒下任何條件時,SQL 就會變成 WHERE ... (後面沒任何東西),這樣會語法錯誤。所以加個 1=1 ,讓SQL 變成 WHERE 1=1. 而如果USER可以下「不等於」的條件,就用 1=0 這種寫法。說穿了就是一些小技巧而以。
你的意思是用字串執行SQL, 但因為WHERE條件中沒有任何條件為了讓SELECT句子完整被執行不會被當成錯誤, 就加上"1<>1"...以讓SELECT可順利執行...但有條件時, 也會自動加上"1<>1", 因為程式邏輯寫成這樣? 這是那個SQL程式設計老師教的?! 我覺得是在誤人子弟耶~ 恕我不客氣這麼說...
動態生成sql語句的話,我會考慮用類似這樣的類別來操作(php啦):
http://framework.zend.com/manual/en/zend.db.select.html
不過沒有trace過,我不知道沒有下where時,他會不會塞1=1...
你被駭客攻擊了,人家用SQL Injection 了.
WHERE A.AAA = B.BBB AND 1<>1 == WHERE 1<>1
TO yohun WHERE FIELD1=VALUE1 AND FIELD2=VALUE2 如果沒有任何東西是
WHERE (FIELD1=VALUE1 AND FIELD2=VALUE2) OR (1=1)
這種怪邏輯盡量不要用.以為自己技術很高超,但漏洞一堆.
我們在 java 1.2 - 1.3 - 1.4 的 時候
我們的 PrepareStatement
如果是要新增一筆資料 會用 1<>1 去讀出整個 "空" Data
SELECT * FROM Invoice WHERE 1<>1
現在我們改純物件時
用的是 MInvoice invoice = new MInvoice(getCtx(), 0, get_TrxName())
我建議你有心改的話
可以用 java open source 可以看到所有 source code,
我也可以跟你技術交流一下
支持你讓你順利上線
Skype: ADempiere/Compiere