Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 否则情况似乎无法正常工作_Mysql_Go - Fatal编程技术网

Mysql 否则情况似乎无法正常工作

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

我有一个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”


您应该习惯在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你说得对,谢谢