Golang中如何将MySQL的ID追加到URL
Golang中如何将MySQL的ID追加到URL 我正在尝试将ID(和其他信息)附加到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(&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))
}
在我的系统中,我希望用户注册他的邮箱和密码,在数据库中创建新用户,并将URL重定向到类似localhost:3306/ployer/complete/id的地址。
更多关于Golang中如何将MySQL的ID追加到URL的实战教程也可以访问 https://www.itying.com/category-94-b0.html
5 回复
更多关于Golang中如何将MySQL的ID追加到URL的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
也许你可以使用这个方法来获取最后插入的ID,而无需执行另一个查询
id, err := res.LastInsertId()
if err != nil {
return err
}
将ID放入URL参数中,如果ID是整数,您需要转换它们吗
http.Redirect(w, r, "/ployer/your-route/" + id, http.StatusSeeOther)
很好!那么将ID附加到URL的正确方式是什么? 有函数可以实现这个功能吗?
在您的代码中,需要将MySQL插入后获取的ID添加到URL中进行重定向。以下是修改后的实现:
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, err := db.Begin()
if err != nil {
http.Error(w, "Database error", http.StatusInternalServerError)
return
}
// 执行插入并获取最后插入的ID
result, err := tx.Exec("INSERT INTO ployers(email_ployer, senha_ployer) VALUES(?,?)", email_ployer, senha)
if err != nil {
tx.Rollback()
http.Error(w, "Insert failed", http.StatusInternalServerError)
return
}
// 获取自动生成的ID
id, err := result.LastInsertId()
if err != nil {
tx.Rollback()
http.Error(w, "Failed to get ID", http.StatusInternalServerError)
return
}
err = tx.Commit()
if err != nil {
http.Error(w, "Commit failed", http.StatusInternalServerError)
return
}
// 构建重定向URL
redirectURL := fmt.Sprintf("/ployer/complete/%d", id)
http.Redirect(w, r, redirectURL, http.StatusSeeOther)
return
}
}
// 处理重定向后的URL
func LoadPloyerContent(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/ployer/complete/") {
// 从URL路径中提取ID
pathParts := strings.Split(r.URL.Path, "/")
if len(pathParts) >= 4 {
idStr := pathParts[3]
// 将字符串ID转换为整数
id, err := strconv.ParseInt(idStr, 10, 64)
if err != nil {
http.Error(w, "Invalid ID", http.StatusBadRequest)
return
}
// 使用ID查询数据库获取用户信息
db := connect.ConnectDB()
defer db.Close()
var email string
err = db.QueryRow("SELECT email_ployer FROM ployers WHERE id = ?", id).Scan(&email)
if err != nil {
http.Error(w, "User not found", http.StatusNotFound)
return
}
// 显示用户信息
fmt.Fprintf(w, "User ID: %d, Email: %s", id, email)
return
}
}
// 处理其他路由
http.Error(w, "404 not found.", http.StatusNotFound)
}
主要修改点:
- 使用
result.LastInsertId()直接获取插入后生成的ID,避免再次查询数据库 - 使用
fmt.Sprintf构建包含ID的重定向URL - 在
LoadPloyerContent函数中从URL路径解析ID并处理请求 - 移除了全局变量
email_ployer,改为局部变量 - 添加了完整的错误处理
这样当用户注册成功后,会被重定向到/ployer/complete/{id},其中{id}是MySQL自动生成的主键ID。

