用于用户名的逻辑存在于grails的数据库中

时间:2013-01-09 01:23:12

标签: database 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
   }
}

所以会发生什么是添加用户,停止循环,检查相同。但是,如果我为else条件返回false。用户将重复添加几次,直到循环停止检查。那么有没有人可以解决这个问题?非常感谢你们。

P.S这只是一个测试,我将在以后实施SQL注入预防

2 个答案:

答案 0 :(得分:3)

老实说,这是最坏情况数据库编程的教科书案例。当您只需在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 :(得分:2)

如果您有一个用户域对象,那么您可以避免一起使用SQL并改为使用dynamic finders

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