あなたのコード例は疑似コードであると仮定しますが、私は明白な場合を明示します。
db.Query("insert into views (?,?,?,?,?,?) values (?,?,?,?,?,?)", colNames..., values...)
これは、列名のプレースホルダ(?
)を使用することはできませんので、あなただけの関数に最後の引数を「解凍」し、また、無効なMySQLのことができるので、無効ゴーです。
db.Query("insert into views " + colNames + " values" + values)
これは無効です。文字列をスライスと連結することはできません。
あなたはこのように見える文字列にスライスをfromatできます
colNamesString := "(col1, col2, col3)"
valuesString := "(val1, val2, val3)"
、今、あなたの2番目のコード例は、有効な移動になり、をコンパイルするだろうが、これをしません。これを行うと、アプリケーションはSQLインジェクションに対して脆弱になります。これは、あなたが間違いなく欲しいものです。
// this can be a package level global and you'll need
// one for each table. Keep in mind that Go maps that
// are only read from are safe for concurrent use.
var validColNames = map[string]bool{
"col1": true,
"col2": true,
"col3": true,
// ...
}
// ...
var colNames, values []string
var phs string // placeholders for values
for k, v := range formData {
// check that column is valid
if !validColNames[k] {
return ErrBadColName
}
colNames = append(colNames, k)
values = append(values, v)
phs += "?,"
}
if len(phs) > 0 {
phs = phs[:len(phs)-1] // drop the last comma
}
phs = "(" + phs + ")"
colNamesString := "(" + strings.Join(colNames, ",") + ")"
query := "insert into views " + colNamesString + phs
db.Query(query, values...)
MySQLを使用している:
は、代わりにこのような何かを? – mkopriva
はい、私はmysqlを使用しています – rocco
これらのツールの1つはhttps://github.com/variadico/scaneoまたはhttps://github.com/drone/sqlgenに役立ちますが、サポートされていないようです –