2017-06-19 2 views
0

nicht arbeiten gehen Ich habe eine MySQL-Datenbank mit einem Wert darin, ein String: "192.168.0.1"Else Zustand scheint in

Hier ist mein Code:

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") 
} 

Als ich "'192.168.0.1'" setzen in ip es funktioniert und zeigt wie erwartet.

Aber wenn ich "'192.168.0.2'" in ip setzen, wird die Else-Anweisung nicht ausgeführt und es wird nur beendet.

Es nicht gedruckt "insert2"

screenshot 1 screenshot 2

+1

Beste Schätzung ist, dass Sie immer noch in der if-Block dann sind. Hast du die Anzahl der Zeilen überprüft, die du zurückbekommst? –

+2

Überprüfen Sie den Fehlerwert, der von 'db.Query' zurückgegeben wird. Es ist oft der Fall, dass Funktionen/Methoden im Fehlerfall ein Null-Wert-Objekt (oder einen Zeiger darauf) zurückgeben. In der Tat wird dies als gute Praxis angesehen. – abhink

+0

@ william.taylor.09 dam du hast recht danke – user462794

Antwort

3

Sie sollten mit gewöhnen '?' Platzhalter in Ihrer SQL-Datei, um eine ordnungsgemäße Auslagerung zu ermöglichen und mögliche SQL-Injection-Angriffe zu verhindern.

Sie sollten immer den Fehler in Go überprüfen, bevor Sie den zurückgegebenen Wert verwenden.

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

Die Rows von Query zurückgegeben wird nicht nil im Fall ergebnislos sein, wird es leer sein. so etwas wie dies versucht:

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") 
} 

Bitte beachte, dass wie @jmaloney sagte, robuste Fehlerbehandlung ist ein Muss, wie Ihre Rows Zeiger zu schließen.