gpt4 book ai didi

mysql - 使用占位符?在 Go mySql 中查询除 int 以外的任何内容

转载 作者:IT王子 更新时间:2023-10-29 02:02:06 26 4
gpt4 key购买 nike

我已经设置并 ping 了我的 mysql 数据库连接。它正在工作,我可以使用 db.Query 和首先准备查询来返回行。我可以使用占位符 ? 来指定一个 id。可以使用吗?作为列名的占位符?在此处的示例中,我试图返回表 personsfirstName 列的所有行。

qry, err := db.Prepare("SELECT ? FROM persons")
if err != nil { log.Fatal(err) }
defer qry.Close()
rows, err :=qry.Query("firstName")
if err != nil { log.Fatal(err) }
defer rows.Close()

我收到以下错误:错误 1064:您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册以了解正确的 '?' 附近使用的语法在第 1 行

最佳答案

您不能将占位符用于标识符(例如表名和列名),占位符用于。您可以将标识符视为类似于 Go 中的变量或函数名称,因此能够对标识符使用占位符类似于在各种脚本语言中使用 eval

当您直到运行时才知道标识符时,这会减少您使用 fmt.Sprintf 和类似的字符串操作来构建 SQL:

col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)

但这会让您面临 SQL 注入(inject)和引用问题,因此您需要某种白名单:

quotedColumns := map[string]string{
"firstName": "`firstName`",
"lastName": "`lastName`",
...
}

quoted, ok := quotedColumns[columnName]
if !ok {
// Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)

请注意,我在 map 的值中包含了 MySQL 反引号。标准接口(interface)中没有用于引用/转义标识符的内容,因此您必须自己做。如果您已经在手写白名单 map ,那么您也可以手写引用;否则,您可以通过阅读有关引用的 MySQL 文档并执行几个(希望如此)简单的字符串操作来为标识符编写自己的引用函数。

关于mysql - 使用占位符?在 Go mySql 中查询除 int 以外的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49846123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com