其他情况似乎不起作用

时间:2017-06-19 18:55:01

标签: 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.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”

screenshot 1 screenshot 2

2 个答案:

答案 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指针一样。