Я изо всех сил пытаюсь добавить идентификатор из mysql к URL

#http #go #redirect

#http #Вперед #перенаправление

Вопрос:

Я пытаюсь добавить идентификатор (и другую информацию) к URL-адресу, чтобы я мог получить к нему доступ позже, но я не могу найти правильный метод после некоторых исследований.

Я пытался использовать метод Get(), query(), Add(), но я не мог перенаправить URL.

 var email_ployer string

func RegisterNewPloyer(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/ployer/register" {
        http.Error(w, "404 not found.", http.StatusNotFound)
        return
    }
    db := connect.ConnectDB()
    defer db.Close()
    switch r.Method {
    case "POST":
        email_ployer = r.FormValue("email")
        senha := r.FormValue("senha")
        senha, _ = HashPassword(senha)
        tx, _ := db.Begin()
        stmt, _ := tx.Prepare("INSERT INTO ployers(email_ployer, senha_ployer) VALUES(?,?)")
        _, erro := stmt.Exec(email_ployer, senha)
        if erro != nil {
            tx.Rollback()
            log.Fatal(erro)
        }
        tx.Commit()
    }
    Redirect(w, r)
}

func Redirect(w http.ResponseWriter, r *http.Request) {
    db2 := connect.ConnectDB()
    defer db2.Close()
    var id string
    tx, _ := db2.Begin()
    rows, _ := tx.Query("SELECT id FROM ployers WHERE email_ployer = '?'", email_ployer)
    for rows.Next() {
        if err := rows.Scan(amp;id); err != nil {
            log.Fatal(err)
        }
        if err := rows.Err(); err != nil {
            log.Fatal(err)
        }
    }
    http.Redirect(w, r, x, http.StatusSeeOther)
}




func main() {
    http.HandleFunc("/ployer/seja-um-de-nos", LoadPloyerContent)
    http.HandleFunc("/ployer/register", register.RegisterNewPloyer)
    http.HandleFunc("/ployer/complete/", LoadPloyerContent)
    http.HandleFunc("/ployer/register-received", LoadPloyerContent)
    log.Fatal(http.ListenAndServe(":3306", nil))
}
  

В моей системе я хочу, чтобы пользователь зарегистрировал свой E-mail и пароль, создал нового пользователя в БД и перенаправил URL-адрес на что-то вроде localhost:3306/ ployer/complete/id

Комментарии:

1. Обратите внимание, что вы замалчиваете множество ошибок в этом коде (например, rows, _ := tx.Query(..) , что почти наверняка не очень хорошая идея. Что, если у вас есть опечатка в SQL-запросе или параметре? Или что, если произойдет что-то неожиданное (база данных ушла)? Вы всегда должны проверять ошибки! Кроме того, email_ployer = '?' выглядит неправильно? Вам не нужны кавычки там, так как вы используете параметризованные запросы. Не уверен, связан ли он с вашей проблемой.

Ответ №1:

Просто используйте res.LastInsertId() , чтобы получить идентификатор и передать его вашей функции перенаправления, и создайте URL:

 func RegisterNewPloyer(w http.ResponseWriter, r *http.Request) {
  //...
  //...
  res, erro := stmt.Exec(email_ployer, senha)
  if erro != nil {
    tx.Rollback()
    log.Fatal(erro)
  }
  tx.Commit()
  id, erro := res.LastInsertId()
  if erro != nil {
    log.Fatal(erro)
  }
  Redirect(w, r, id)
}

func Redirect(w http.ResponseWriter, r *http.Request, id int64) {
    uri := fmt.Sprintf("http://localhost:3306/ployer/complete/%d", id)
    http.Redirect(w, r, uri, http.StatusSeeOther)
}
  

Ответ №2:

Вы должны использовать url.Values для построения карты значений строки запроса. Позже вы можете использовать Encode метод для генерации закодированной строки запроса. Присвойте это значение Url.RawQuery , чтобы получить окончательный результат.

например:

 base, _ := url.Parse("https://www.foo.com/")

// Create an instance of Values to hold your query string parameters
values := url.Values{}
values.Add("abc", "def")

// Set the encoded output to RawQuery attribute of Url
base.RawQuery = values.Encode()

println(base.String())
  

Если вы начинаете с URL-адреса, в котором уже есть параметры строки запроса, и вы хотите добавить / изменить в нем элементы, используйте Query() метод для получения ссылки на проанализированную карту.

например:

 base, _ := url.Parse("https://www.foo.com/?a=b")

values := base.Query()
values.Set("a", "c")
values.Set("x", "y")

// Set the encoded output to RawQuery attribute of Url
base.RawQuery = values.Encode()

println(base.String())