0

我在思考逻辑时遇到了一些麻烦,我不知道如何解决这个问题。基本上我要做的是无法使用相同的用户名在其中添加额外的用户。这就是它的完成方式。

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
   }
}

因此,当添加用户时,会发生循环 while stop,与检查相同。但是,如果我将 return false 设置为 else 条件。用户将被重复添加几次,直到循环停止检查。那么有没有人可以解决这个问题?非常感谢你们。

PS这只是一个测试,我稍后会实施SQL注入预防

4

2 回答 2

3

老实说,这是最坏情况数据库编程的教科书案例。where当您可以简单地在 SQL 中使用子句时,您将遍历数据库中的每个用户名以查找其中一个。当有 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
于 2013-01-09T02:41:31.267 回答
2

如果您有一个用户域对象,那么您可以避免一起使用 SQL,而是使用动态查找器

if(User.findByUsername(params.username)){
    flash.message = "username exist"
}
else{
    new User(username:params.username).save()
}
于 2013-01-09T20:13:18.957 回答