2017-08-11 8 views
0

ログインページを実装するためにgrailsでSELECT WHEREクエリを実行しようとしています。私はPHPやSpringをデータ検証に使用するはずがありません。Grails - MysqlでSELECT WHEREを実行できません

user.groovy

パッケージloginmysql

class User { 

    String userName 
    String password 

    static constraints = { 
     userName (unique:true) 
     password (password:true) 
    } 
} 

userController.groovy

package loginmysql 

class UserController { 

    def UserService 

    def index() { 
    UserService.createTables(); 
    //UserService.insertToTables() // upon Inserting, must not be inserted twice 
} 

def login() { 
    UserService.searchLoginInput(params.userName,params.password) 
    redirect(action: "index") // return to index page again and display login message*/ 
} 

} 

userService.groovy

ここでは
package loginmysql 

import grails.transaction.Transactional 
import groovy.sql.Sql 

@Transactional 
class UserService { 

    def dataSource 

    def searchLoginInput(String input_user, String input_pass) { 
     def sql = new Sql(dataSource) 
     def sql2 = new Sql(dataSource) 
     int userNum = 0 
     sql.eachRow('SELECT userName FROM users WHERE userName=$input_user') { row -> 
      if (input_user == row.userName) { 
       sql2.eachRow('SELECT password FROM users WHERE password=$input_pass') { row2 -> 
        if (input_pass == row2.password) { 
         flash.message = " login succeded!!!" 
         session.user = input_user // keep info on who connected 
         userNum++ 
        } else { 
         flash.message = "login failed!!!" 
        } 
       } 
      } 
     } 
     if (userNum==0) flash.message = "Username not found!!!" 
    } 

    def createTables(){ 
     def sql = new Sql(dataSource) 
     sql.execute ''' 
      CREATE TABLE IF NOT EXISTS users (
      userId INTEGER AUTO_INCREMENT PRIMARY KEY NOT NULL, 
      userName VARCHAR(50) UNIQUE, 
      password VARCHAR(100) 
      )ENGINE=InnoDB DEFAULT CHARSET=utf8; 
      ''' 
    } 

    def insertToTables(){ 
     def sql = new Sql(dataSource) 
     def params = ['vagg77', 'pass'] 
     sql.execute 'INSERT INTO users (userName, password) VALUES (?, ?)', params 
     params = ['mary', 'pass'] 
     sql.execute 'INSERT INTO users (userName, password) VALUES (?, ?)', params 
    } 
} 

は、ページのログイン時に何が起こるかです:

enter image description here

私はsearchLoginInput内部のprintln()関数を()を追加した場合、その後、私は値が正しく、私に私のコントローラから送信されていることがわかりサービス

enter image description here

これは私が持っている正確なエラーです:

enter image description here

私が質問したのはMySQLで間違った構文があったため、mysqlコンソールでクエリを実行しようとしました。コンソールで

データベースエントリ

enter image description here

MySQLのクエリ

enter image description here

+0

GStringsは二重引用符ではなく二重引用符を使用します。したがって、sql.eachRow( "SELECT userName FROM users WHERE userName = $ {input_user}")にする必要があります。また、中括弧の使用にも注意してください。 –

答えて

1

Groovyの文字列(またはGStringの)における変数置換は、単一、二重引用符を使用することができませんが必要です引用符。プラス、中括弧の使用。代わりに、ゴームのSQLを使用する理由

"SELECT userName FROM users WHERE userName=${input_user}"

+0

頭がおかげでありがとう、フォーマットの悪いコードからわかるように、私はgrailsで初心者です。あなたの助けを借りてありがとう –

+1

"しかし、サイドノートとして、このようなSQL文を作成すべきではありません。 - それは本当だとは思わない。 'Sql'クラスはそのプロパティへのアクセスを傍受し、適切なエスケープを行います。 –

+1

これは、引数として 'GString'を受け入れる' eachRow'のようなオーバーロードされたバージョンのメソッドを持っているため、文字列はargとして渡される前に補間されません。 https://github.com/apache/groovy/blob/473bd1a6524781229a93c9233a622d7a1bec96de/subprojects/groovy-sql/src/main/java/groovy/sql/Sql.java#L1553を参照してください。そこから、個々のパラメータ値は 'GString'から引き出され、残りの文字列値は' GString'から取り出され、最終的には 'PreparedStatement'が作成され、パラメータが設定され、SQLインジェクションセーフです。 –

0

だから、あなたのケースでは、あなたのSQL文を作成すると、このようになりますか? クエリを変更したい場合は、これを使うだけです:

User.findByUsername(input_user) 
+0

GORMの代わりにデータソースを挿入したSQLクエリを使用するように指示されています:P –

+0

しかし、Grails初心者の方は、GORMではなくSQLクエリで作業することをお勧めします。ストアドプロシージャで作業する必要がない限り、Grailsの基準を使用する必要があります。 –

+1

Ok、感謝の意;) –

関連する問題