2016-06-14 9 views
2

私のコードは以下の(私はGORMを使用)のようになります。Golang - SQLプレースホルダが機能しないのはなぜですか?

e.GET("/search", func(c echo.Context) error { 
    keyword := c.QueryParam("keyword") 

    results := make([]searchResult, 0) 
    if keyword != "" { 
     db, err := models.ConnectDB() 
     defer db.Close() 
     if err != nil { 
      return err 
     } 

     rows, err := db.Raw("SELECT songs.name, singers.name, albums.name FROM songs, singers, albums WHERE (songs.singer_id = singers.id AND songs.album_id = albums.id) AND (songs.name LIKE '%?%' OR singers.name LIKE '%?%' OR albums.name LIKE '%?%')", keyword, keyword, keyword).Rows() 
     defer rows.Close() 

     var songName, singerName, albumName string 
     if err == nil { 
      for rows.Next() { 
       rows.Scan(&songName, &singerName, &albumName) 
       results = append(results, searchResult{ 
        SongName: songName, 
        SingerName: singerName, 
        AlbumName: albumName, 
       }) 
      } 
     } else { 
      return err 
     } 
    } 
    return c.Render(http.StatusOK, "search", results) 
}) 

私はエラーました:sql: statement expects 0 inputs; got 3をので、プレースホルダを解析できなかったことを意味します。誰も私に何か考えを与えることができますか?

私は自分で理由を見つけることができません。

私を助けてください。ありがとう。

答えて

4

'?'のような文字列内にプレースホルダを配置することはできません。

文字列補間のように機能しないのは、可変バインディングだけです。

ので、試してみてください。

searchKeyword := "%" + keyword + "%" 
    rows, err := db.Raw(`SELECT songs.name, singers.name, albums.name 
     FROM songs, singers, albums 
     WHERE (songs.singer_id = singers.id AND songs.album_id = albums.id) 
     AND (songs.name LIKE ? OR singers.name LIKE ? OR albums.name LIKE ?)`, 
     searchKeyword, 
     searchKeyword, 
     searchKeyword).Rows() 
関連する問題