2017-06-19 47 views
0

我有在這一個值的MySQL數據庫,一個字符串:「192.168.0.1」else條件似乎不工作中去

這裏是我的代碼:

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:[email protected](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語句不運行,它只是退出。

它沒有打印

screenshot 1 screenshot 2

+1

最好的猜測是你仍然在if塊。你檢查了你回來的行數嗎? –

+2

檢查'db.Query'返回的錯誤值。在出現錯誤的情況下,函數/方法通常會返回一個零值對象(或指向它的指針)。實際上這被認爲是很好的做法。 – abhink

+0

@ william.taylor.09 dam你是對的謝謝 – user462794

回答

3

你應該習慣使用 「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 
} 
0

通過查詢返回的不會nil在沒有結果的情況下,Rows,它將是空的。嘗試是這樣的:

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指針。