与MySql的Golang ORDER BY问题

我似乎无法使用db.Select()动态ORDER BY.我用Google搜索没有运气……

作品

rows,err:= db.Query(“SELECT * FROM Apps ORDER BY title DESC”)

什么都不行

rows,err:= db.Query(“SELECT * FROM Apps ORDER BY?DESC”,“title”)

我没有收到任何错误,查询根本无法订购.

最佳答案
占位符(‘?’)只能用于为过滤器参数插入动态的转义值(例如在WHERE部分中),其中应显示数据值,而不是SQL关键字,标识符等.您不能使用它来动态指定ORDER BY OR GROUP BY值.

您仍然可以这样做,例如,您可以使用fmt.Sprintf()来组合动态查询文本,如下所示:

ordCol := "title"

qtext := fmt.Sprintf("SELECT * FROM Apps ORDER BY %s DESC", ordCol)
rows, err := db.Query(qtext)

要记住的事情:

这样做你必须手动防御vs SQL注入,例如如果列名的值来自用户,则不能接受任何值,只需将其直接插入查询中,否则用户将能够执行各种不良操作.平凡的,你应该只接受英文字母数字下划线(‘_’)的字母.

如果不尝试提供完整的,全面的检查器或转义函数,您可以使用这个只接受英文字母,数字和’_’的简单正则表达式:

valid := regexp.MustCompile("^[A-Za-z0-9_]+$")
if !valid.MatchString(ordCol) {
    // invalid column name, do not proceed in order to prevent SQL injection
}

示例(在Go Playground上尝试):

fmt.Println(valid.MatchString("title"))         // true
fmt.Println(valid.MatchString("another_col_2")) // true
fmt.Println(valid.MatchString("it's a trap!"))  // false
fmt.Println(valid.MatchString("(trap)"))        // false
fmt.Println(valid.MatchString("also*trap"))     // false

转载注明原文:与MySql的Golang ORDER BY问题 - 代码日志