sql where 1=1 的詳細解釋


原文來自:https://blog.csdn.net/zc474235918/article/details/50544484

看一下這兩個句子:

select * from user select * from user where 1=1

這兩個 句子執行結果是一樣一樣的。而sql注入就是利用了這個原理 來進行破壞。比如:

select * from user where id='1000'

如果允許用戶輸入的話,那么這個句子就成了:

select * from user where id='XXX' or 1=1

這樣的話,這個句子就是恆成立的了。

       上述1=1 的使用,會影響預先指定的查詢結果,使得本來要查詢的數據 失效。 
       where 1=1 這種寫法 雖然給程序開發人員帶來不便,還要避免sql注入的問題。       但 “1=1” 這種寫法 也會給程序編寫增加了方便。

1=1 可以很方便的規范語句

       對於組合查詢的來說,因為查詢比較模糊,而查詢的where條件的個數也不確定。 
一般這樣的sql語句進行查詢的時候:

sql.append("select * from User"); if (whereUser.getID()!="") { sql.append(" where ID=@id"); } if (whereUser.getName()!="") { sql.append(" and Name=@name"); } if (whereUser.getAddress()!="") { sql.append(" and Phone=@phone"); }

       對於上述這種寫法,邏輯上感覺沒有問題。但是如果whereUser里面的id為空。那么最后拼接出來得到的語句會成:

select * from User and Name='XXX' and Phone='XXX'.

       這條語句 沒有where關鍵字,肯定會報錯的。 
       但是如果說,既然條件個數未知,那么把where關鍵字放到 if外面去:

sql.append("select * from User"); sql.append("where"); if (whereUser.getID()!="") { sql.append(" ID=@id"); } if (whereUser.getName()!="") { sql.append(" and Name=@name"); } if (whereUser.getAddress()!="") { sql.append(" and Phone=@phone"); }

       這樣寫的話,如果三個條件都為空。則這是一條不帶查詢條件的查詢。那么最后這條語句會被解析成:

select * from User where;

       這條語句,空有where關鍵字 沒有條件,照樣會報錯的。

       對於解決上述這種未知的問題,只能進行各種情況的判斷進行拼接。

當然可以用“where 1=1”進行代碼的規范:

sql.append("select * from User where 1=1 "); if (whereUser.getID()!="") { sql.append(" and ID=@id"); } if (whereUser.getName()!="") { sql.append(" and Name=@name"); } if (whereUser.getAddress()!="") { sql.append(" and Phone=@phone"); }

       對於上述的這種寫法,無論是否有條件 都是可以成立的。

無條件的的時候:

select * from User where 1=1;

有條件的時候:

select * from User where 1=1 and id='XX' ……;

       這樣寫的代碼,會比 分情況判斷的代碼 更規范。對於以上的寫法,並不是唯一的。也可以使 where ‘a’=’a’ 、’a’<>’b’等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM