2014-06-11 4 views
-1

Pendant que nous écrivons une application Web, nous allons utiliser SQL prepare au lieu de chaînes SQL concat pour éviter l'injection SQL. Par exemple:SQL prepare for WHERE IN

sql.exec("select * from user where user_id=?", user_id) 

Mais comment écrire préparer WHERE...IN dans SQL? Par exemple:

sql.exec("select * from user where user_id in ?", user_ids) 

Si cela est impossible. Quelle est la bonne façon d'éviter l'injection SQL dans une telle situation?

Merci.

+0

Peut-être que je ne suis pas clair. Je ne demande pas le chemin en PHP. Je voudrais savoir s'il existe des moyens généraux dans la langue qui supporte le pilote MySQL. –

+0

Quel est le langage hôte de l'application? Notez que la plupart des pilotes ne prennent pas en charge les paramètres de tableau, donc la réponse essentielle est la même - construire une liste de variables de remplacement, puis lier les valeurs. –

+0

@ Clockwork-Muse J'utilise Golang pour le moment. –

Répondre

0

changer la chaîne de la matrice id:

idArr = strings.Split(user_ids, ",") 

créer sql:

vals := []interface{}{} 
sqlStr := "select * from user where user_id in (" 
for _,v := range idArr { 
    vals = append(vals, v) 
    sqlStr += "?," 
} 
sqlStr = strings.TrimRight(sqlStr, ",") 
sqlStr += ")" 

stmt, err := db.Prepare(sqlStr) 
if err!=nil{ 
    return err 
} 
defer stmt.Close() 

rows, err := stmt.Query(vals...)