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

したがって、ユーザーが追加されると、停止中のループがチェックと同じように発生します。ただし、else条件にreturn falseを設定すると。ループがチェックを停止するまで、ユーザーは数回繰り返し追加されます。それで、これを解決できる人はいますか?? どうもありがとうございました。

PS これは単なるテストであり、後で SQL インジェクション防止を実装します。

4

2 に答える 2

3

これは正直なところ、最悪のデータベース プログラミングの典型例です。whereSQL で単純に節を使用できる場合は、データベース内のすべてのユーザー名をループして、そのうちの 1 つを探します。10 人のユーザーがいる場合はこれで問題ありませんが、100 万人のユーザーがいる場合のパフォーマンスを考慮してください。

これを試してください(そして追加のボーナスとして、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 に答える