登录
首页 >  Golang >  Go问答

Golang ORDER BY 与 MySql 的问题

来源:Golang技术栈

时间:2023-03-05 21:49:43 153浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《Golang ORDER BY 与 MySql 的问题》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到golang等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我似乎无法使用 db.Select() 动态排序。我用谷歌搜索没有任何运气......

作品

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 BYORGROUP 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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表