2015-10-12 2 views
0

Я использую Grails, работаю с MySQL, используя groovy.sql.sql.Запрос с groovy.sql.sql не работал, но он работает с MySQLWorkbench

Я сделал запрос в своем контроллере, но он не работал. Хотя я скопировал свой код sql для работы в mySQL Workbench, он работал нормально.

Вот мой код в контроллере,

def createSomething(){ 
    def sql = new Sql(dataSource) 
    def Title = params.playlistName 
    def StartDate = params.startDate 
    def EndDate = params.endDate 

    def map = [title:Title, start:StartDate, end:EndDate] 
    sql.execute (
    "START TRANSACTION;"+ 
    "BEGIN;"+ 
    "INSERT INTO playlist (`name`) VALUES ('$map.title');"+ 
    "SELECT playlist.id from playlist where playlist.name = '$map.title' INTO @playlistId;"+ 
    "INSERT INTO playlist_has_media(`idMedia`,`order`,`idPlaylist`)VALUES(1,1,@playlistId),(2,2,@playlistId),(3,3,@playlistId);"+ 
    "INSERT INTO schedule(`name`,`startDate`,`endDate`,`idPlaylist`,`isSync`)VALUES('$map.title', '$map.start', '$map.end', @playlistId, 1);"+ 
    "COMMIT;" 
) 

} 

Он показал мне ошибку, но я скопировал из напечатанного кода SQL для MySQL Workbench для запуска. Это сработало.

+2

Можете ли вы опубликовать ошибку? – Parth

+0

Вы передаете строки, предоставленные пользователем, в sql-запросах? это имеет большой потенциал для SQL-инъекций. – cfrick

ответ

0

Попробуйте удалить одиночные кавычки:

def createSomething(){ 
     def sql = new Sql(dataSource) 
     def Title = params.playlistName 
     def StartDate = params.startDate 
     def EndDate = params.endDate 

     def map = [title:Title, start:StartDate, end:EndDate] 

     sql.execute (
       "START TRANSACTION;"+ 
         "BEGIN;"+ 
         "INSERT INTO playlist (`name`) VALUES ($map.title);"+ 
         "SELECT playlist.id from playlist where playlist.name = $map.title INTO @playlistId;"+ 
         "INSERT INTO playlist_has_media(`idMedia`,`order`,`idPlaylist`)VALUES(1,1,@playlistId),(2,2,@playlistId),(3,3,@playlistId);"+ 
         "INSERT INTO schedule(`name`,`startDate`,`endDate`,`idPlaylist`,`isSync`)VALUES($map.title, $map.start, $map.end, @playlistId, 1);"+ 
         "COMMIT;" 
     ) 

    } 

Кроме того, возможно, вы могли бы сделать его более заводной

sql.withTransaction {stmt -> 
    def playlistId = sql.executeInsert("INSERT INTO playlist (`name`) VALUES ($map.title);") 
    sql.executeInsert("INSERT INTO playlist_has_media(`idMedia`,`order`,`idPlaylist`)VALUES(1,1,$playlistId),(2,2,$playlistId),(3,3,$playlistId);") 
    sql.executeInsert("INSERT INTO schedule(`name`,`startDate`,`endDate`,`idPlaylist`,`isSync`)VALUES($map.title, $map.start, $map.end, $playlistId, 1);") 
} 
Смежные вопросы