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 回复

你可以使用:

http.Redirect(w, r, newUrl, http.StatusSeeOther)

https://golang.org/pkg/net/http/#Redirect

更多关于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)
}

主要修改点:

  1. 使用result.LastInsertId()直接获取插入后生成的ID,避免再次查询数据库
  2. 使用fmt.Sprintf构建包含ID的重定向URL
  3. LoadPloyerContent函数中从URL路径解析ID并处理请求
  4. 移除了全局变量email_ployer,改为局部变量
  5. 添加了完整的错误处理

这样当用户注册成功后,会被重定向到/ployer/complete/{id},其中{id}是MySQL自动生成的主键ID。

回到顶部