2013-01-09 29 views
0

我有一些思考邏輯的麻煩,我不知道如何解決這個問題。基本上我試圖做的是無法用相同的用戶名添加額外的用戶。這是如何完成的。Grails數據庫中存在用戶名邏輯

String select = "select username from user" 
def sot = sql.rows(select) 

sot.find() { 
    def count = it["username"] 
    if (params.username != count) { 
     String queryname = "insert into user (username, class) values('" + params.username + "','" + params.class1 + "')" 
     println(queryname) 
     def Query1 = sql.executeInsert(queryname) 
     [ Query1: Query1] 
     flash.message = "Successfully added user " + params.username 
     return true 
    } 
    else { 
     flash.message = "Username exist" 
     return true 
    } 
} 

所以會發生什麼情況是當用戶被添加時,循環停止時,同樣的檢查。但是,如果我把其他條件返回false。用戶將被重複添加幾次,直到循環停止檢查。那麼有沒有人可以解決這個問題?非常感謝你們。

P.S這只是一個測試,我會在以後的時間

回答

3

這是誠實最壞情況的數據庫編程的教科書案例實施SQL注入預防。當你可以簡單地在你的SQL中使用where子句時,你將循環訪問數據庫中的每個用戶名,尋找其中的一個用戶名。當有10個用戶時這很好,但是當你有一百萬時考慮性能。

試試這個(並作爲額外的獎勵,我已經修復你的SQL注入攻擊):

def row = sql.firstRow(
    'select count(*) from user where username=?', 
    [params.username]) 

if (row[0]) { 
    flash.message = "Username exist" 
    return true 
} 

sql.executeUpdate(
    'insert into user (username, class) values(?, ?)', 
    [params.username, params.class1]) 

flash.message = "Successfully added user " + params.username 
return true 
+1

更不用說,因爲這是一個Grails應用程序,他並沒有使用HQL或對象本身。 –

+0

非常感謝您的幫助。它現在起作用了,我從中學到很多東西:) – user1681961

2

如果你有一個用戶域對象,那麼你能避免使用SQL一起,使用dynamic finders代替。

if(User.findByUsername(params.username)){ 
    flash.message = "username exist" 
} 
else{ 
    new User(username:params.username).save() 
}