【发布时间】:2017-08-11 12:31:26
【问题描述】:
我正在尝试在 grails 中执行 SELECT WHERE 查询以实现登录页面。我不应该使用 PHP 或 Spring 进行数据验证。
user.groovy
包登录mysql
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}").还要注意花括号的使用。
标签: mysql select grails groovy