ログインページを実装するために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
}
}
は、ページのログイン時に何が起こるかです:
私はsearchLoginInput内部のprintln()関数を()を追加した場合、その後、私は値が正しく、私に私のコントローラから送信されていることがわかりサービス
これは私が持っている正確なエラーです:
私が質問したのはMySQLで間違った構文があったため、mysqlコンソールでクエリを実行しようとしました。コンソールで
データベースエントリ
MySQLのクエリ
GStringsは二重引用符ではなく二重引用符を使用します。したがって、sql.eachRow( "SELECT userName FROM users WHERE userName = $ {input_user}")にする必要があります。また、中括弧の使用にも注意してください。 –