Mysql 否则情况似乎无法正常工作
我有一个MySQL数据库,其中有一个值,一个字符串:“192.168.0.1” 这是我的密码:Mysql 否则情况似乎无法正常工作,mysql,go,Mysql,Go,我有一个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.O
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”
您应该习惯在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
}
您应该习惯在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
}
查询返回的
行
不会是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所说,更健壮的错误处理是必须的,因为关闭
行
指针。查询返回的行
不会是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所说的,更健壮的错误处理是必须的,就像关闭
行指针一样。最好的猜测是您仍然处于if块中。是否检查了要返回的行数?检查由db.Query返回的错误值。在发生错误的情况下,函数/方法通常返回零值对象(或指向它的指针)。事实上,这被认为是一种良好的做法。@william.taylor.09 dam你是对的,谢谢。最好的猜测是,你仍然处于if区。是否检查了要返回的行数?检查由db.Query返回的错误值。在发生错误的情况下,函数/方法通常返回零值对象(或指向它的指针)。事实上,这被认为是良好的做法。@william.taylor.09 dam你说得对,谢谢