I can't view all my MySQL table data on HTML

Viewed 139

I got all data from MySQL table and I printed it with "log" function but I need to print it on an HTML page. I could print just one column. I want to print all products data. How Can I Do This?

In short: I want to list all products for the shop page, but I can only list one product. (I will add hundreds of products. Currently, there are only 3 products in my table.)

I haven't solved it for 2 days, I will be very glad if you can help. Many thanks... Go File

package main

import ( "database/sql" "fmt" "log" "net/http" "text/template"

_ "github.com/go-sql-driver/mysql"
)

type product struct { ID int Name string Stock int Price float32 }

var products product

func handler(w http.ResponseWriter, r *http.Request) {

products = product{
    ID:    products.ID,
    Name:  products.Name,
    Stock: products.Stock,
    Price: products.Price,
}

appointment, _ := template.ParseFiles("ot.html")
appointment.Execute(w, products)
}

func main() { fmt.Println("Go MySQL Tutorial")

sqlType := "mysql"
sqlUsn := "root"
sqlPass := "2582064"
sqlDatabase := "gowdb"

db, err := sql.Open(sqlType, sqlUsn+":"+sqlPass+"@/"+sqlDatabase)
if err != nil {
    panic(err.Error())
}

defer db.Close()

results, err := db.Query("SELECT * FROM products")
if err != nil {
    panic(err.Error())
}

for results.Next() {

    err = results.Scan(&products.ID, &products.Stock, &products.Price, &products.Name)
    if err != nil {
        panic(err.Error())
    }

    log.Println(products.Name)
}

if err != nil {
    panic(err.Error())
}

http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}

HTML PAGE

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>PRODUCT 1</h1>
    <div>NAME: {{.Name}}</div>
    <div>PRICE: {{.Price}}</div>
    <div>STOCK: {{.Stock}}</div>
    <div>ID: {{.ID}}</div>
    <div>BUY FROM: xxx.com</div>

<h1>PRODUCT 2</h1>
<div>NAME: {{.Name}}</div>
<div>PRICE: {{.Price}}</div>
<div>STOCK: {{.Stock}}</div>
<div>ID: {{.ID}}</div>
<div>BUY FROM: xxx.com</div>

<h1>PRODUCT 3</h1>
<div>NAME: {{.Name}}</div>
<div>PRICE: {{.Price}}</div>
<div>STOCK: {{.Stock}}</div>
<div>ID: {{.ID}}</div>
<div>BUY FROM: xxx.com</div>
</body>
</html>

OUTPUT ON LOG(thats ok)

Electron Mask Filtrop Mask Aircrop Mask

OUTPUT ON HTML PAGE

PRODUCT 1 NAME: Aircrop Mask PRICE: 19 STOCK: 2 ID: 2 BUY FROM: xxx.com

PRODUCT 2 NAME: Aircrop Mask PRICE: 19 STOCK: 2 ID: 2 BUY FROM: xxx.com

PRODUCT 3 NAME: Aircrop Mask PRICE: 19 STOCK: 2 ID: 2 BUY FROM: xxx.com

1 Answers

So I have fixed your code but takes this with a grain of salt as I did not test it. Please have in mind as well that several things in your original code are plain wrong. Just to mention one, the handler was grabbing the response from a global variable. That's a recipe for disaster and you need to get "unused" to do that, or it will bring you troubles further down the road.

The best I can say is have this code reviewed by your teachers.

main.go

package main

import (
    "database/sql"
    "net/http"
    "text/template"

    _ "github.com/go-sql-driver/mysql"
)

type product struct {
    ID    int
    Name  string
    Stock int
    Price float32
}

func handler(w http.ResponseWriter, r *http.Request) {
    appointment, _ := template.ParseFiles("ot.html")
    appointment.Execute(w, GetProducts())
}

func main() {

    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

func GetProducts() []product {
    var out = make([]product, 0, 10)
    sqlType := "mysql"
    sqlUsn := "root"
    sqlPass := "2582064"
    sqlDatabase := "gowdb"

    db, err := sql.Open(sqlType, sqlUsn+":"+sqlPass+"@/"+sqlDatabase)
    if err != nil {
        panic(err.Error())
    }

    defer db.Close()

    results, err := db.Query("SELECT * FROM products")
    if err != nil {
        panic(err.Error())
    }

    for results.Next() {
        var p product
        err = results.Scan(&p.ID, &p.Stock, &p.Price, &p.Name)
        if err != nil {
            panic(err.Error())
        }
        out = append(out, p)
    }

    if err != nil {
        panic(err.Error())
    }
    return out
}

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    {{ range $i, $e := . }}
        <h1>PRODUCT $i</h1>
        <div>NAME: {{.Name}}</div>
        <div>PRICE: {{.Price}}</div>
        <div>STOCK: {{.Stock}}</div>
        <div>ID: {{.ID}}</div>
        <div>BUY FROM: xxx.com</div>
    {{end}}
</body>
</html>
Related