0

When I write the code:

err := database.QueryRow("SELECT page_title,page_content,page_date FROM pages WHERE id=1").
    Scan(&thisPage.Title, &thisPage.Content, &thisPage.Date)

Everything works fine. But I want it to not just get the page with id=1, but to be dynamic.

So I write:

err := database.QueryRow("SELECT page_title,page_content,page_date FROM pages WHERE id=?", pageID).
    Scan(&thisPage.Title, &thisPage.Content, &thisPage.Date)

But I get an error:

GolangdProjects go run test.go  
1  
2017/04/13 11:29:57 Couldn't get page: 1  
exit status 1

The full code:

package main

import (
  "database/sql"
  "fmt"
  _ "github.com/lib/pq"
  "github.com/gorilla/mux"
  "log"
  "net/http"
)

const (
  DBHost = "localhost"
  DBPort = ":5432"
  DBUser = "nirgalon"
  DBPass = ""
  DBDbase = "cms"
  PORT = ":8080"
)

var database *sql.DB

type Page struct {
  Title string
  Content string
  Date string
}

func ServePage(w http.ResponseWriter, r *http.Request) {
  vars := mux.Vars(r)
  pageID := vars["id"]
  thisPage := Page{}
  fmt.Println(pageID)
  err := database.QueryRow("SELECT page_title,page_content,page_date FROM pages WHERE id=1").Scan(&thisPage.Title, &thisPage.Content, &thisPage.Date)
  if err != nil {
    log.Fatal("Couldn't get page: " + pageID)
    log.Fatal(err.Error)
  }
  html := `<html><head><title>` + thisPage.Title + `</title></head><body><h1>` + thisPage.Title + `</h1><div>` + thisPage.Content + `</div></body></html>`
  fmt.Fprintln(w, html)
}

func main() {
  db, err := sql.Open("postgres", "user=nirgalon dbname=cms sslmode=disable")
  if err != nil {
    log.Println("Couldn't connnect to db")
    log.Fatal(err)
  }
  database = db

  routes := mux.NewRouter()
  routes.HandleFunc("/page/{id:[0-9]+}", ServePage)
  http.Handle("/", routes)
  http.ListenAndServe(PORT, nil)
}
1
  • Please don't include images of error messages. Instead copy/paste the text of the error message. That makes searching much easier, not to mention reading for the visually impaired. Commented Apr 13, 2017 at 15:56

2 Answers 2

1

psql driver uses $1, $2, etc for params:

database.QueryRow("SELECT page_title,page_content,page_date FROM pages WHERE id = $1", pageID)
Sign up to request clarification or add additional context in comments.

Comments

0

QueryRow takes var args of type interface{}. It could be that pageID is being interpolated as a string (as returned by mux.Vars), resulting in a query that's incorrectly formatted as:

"SELECT page_title,page_content,page_date FROM pages WHERE id='1'"

Try converting pageID to int:

id := vars["id"]
pageID := strconv.Atoi(id)

1 Comment

Hi, thanks for the answer. I tried this and get the same error.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.