2017-10-13 28 views
0

を使って移動して新しいMySQLデータベースの作成:私はこのコードを変更し、DB名を連結した場合私は新しいMySQLデータベースを作成しようとしていますプリペアドクエリ

2017/10/13 12:46:16 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 

package main 

import (
    "database/sql" 
    "fmt" 
    "log" 

    _ "github.com/go-sql-driver/mysql" 
) 

func createDBIfNotExists() { 
    const (
     DB_NAME = "new_db" 
     DB_USER = "root" 
     DB_PASS = "777" 
     DB_HOST = "localhost" 
     DB_PORT = "3306" 
    ) 

    var dbUrl = fmt.Sprintf("%s:%[email protected](%s:%s)/", DB_USER, DB_PASS, DB_HOST, DB_PORT) 

    db, err := sql.Open("mysql", dbUrl) 
    defer db.Close() 
    handleError(err) 

    prepared, err := db.Prepare("CREATE DATABASE IF NOT EXISTS ?") 
    handleError(err) 

    _, err = prepared.Exec(DB_NAME) 
    handleError(err) 
} 

func main() { 
    createDBIfNotExists() 
} 

func handleError(err error) { 
    if err != nil { 
     log.Fatal(err) 
    } 
} 

をしかし、このコードは、エラーを返しますクエリに:

prepared, err := db.Prepare("CREATE DATABASE IF NOT EXISTS " + DB_NAME) 
handleError(err) 
_, err = prepared.Exec() 

私は潜在的なSQLインジェクションを持っていないでしょう。

DBの作成をどのように準備して実行できますか?

答えて

3

できません。プリペアドステートメントプレースホルダーはparameter values onlyで、identifiersではバインドしません。

+0

ありがとうございました。この問題を解決するための唯一の方法は連結のようですが、私の場合は環境変数からDB_NAMEを受け取り、連結したい場合は検証コードを書く必要があります – volodymyrkoval

+0

@volodymyrkoval:正しいです。この場合、独自の検証を提供する必要があります。 – Flimzy

関連する問題