我有一个MySQL数据库,其中包含一个值,一个字符串:“192.168.0.1”
这是我的代码:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func main() {
db, err := sql.Open("mysql", "be:me@tcp(127.0.0.1:3306)/ipdb?charset=utf8")
checkErr(err)
ip := "'192.168.0.1'"
rows, err := db.Query("SELECT * FROM Ip_ipdata WHERE ipHost=" + ip)
fmt.Println("insert")
if rows != nil {
for rows.Next() {
var id int
var ip string
err = rows.Scan(&id, &ip)
checkErr(err)
fmt.Println(id)
fmt.Println(ip)
}
} else {
fmt.Println("insert2")
stmt, err2 := db.Prepare("INSERT Ip_ipdata SET ipHost=2")
checkErr(err2)
_, err3 := stmt.Exec(ip)
checkErr(err3)
}
fmt.Println("end")
}
当我将"'192.168.0.1'"
放入ip
时,它会正常工作并按预期显示。
但是,当我将"'192.168.0.2'"
放入ip
时,else语句未运行且只是退出。
它没有打印“insert2”
答案 0 :(得分:3)
你应该习惯使用'?'你的SQL中的占位符允许正确的转义并防止任何潜在的SQL注入攻击。
在使用返回值之前,应始终检查Go中的错误。
ip := "192.168.0.1"
rows, err := db.Query("SELECT * FROM Ip_ipdata WHERE ipHost=?", ip)
if err != nil {
// handle error
}
// this will ensure that the DB connection gets put back into the pool
defer rows.Close()
for rows.Next() {
// scan here
}
答案 1 :(得分:0)
如果没有结果,查询返回的Rows
将不是nil
,它将为空。尝试这样的事情:
func main() {
...
fmt.Println("insert")
checkErr(err)
defer rows.Close()
var found bool
for rows.Next() {
found = true
...
}
if !found {
fmt.Println("insert2")
...
}
fmt.Println("end")
}
请注意,就像@jmaloney所说的那样,更强大的错误处理是必须的,就像关闭Rows
指针一样。