Не работает аутентификация на golang MySQL

Хотел создать регистрацию/авторизацию на сайте, регистрация уже работает, а вот код аутентификации почему то нет. Ожидаю переход на домашнюю страницу при правильности введенных данных(и вывод сообщения в обратном случае), а оно не переходит. Может я в целом не то делаю, может проблема в коде. Вот сам код:

func log(w http.ResponseWriter, r *http.Request) {
    FormEmail := r.FormValue("email")
    FormPassword := r.FormValue("password")
    var email string
    var password string
    // подключение
    db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:8889)/service")
    if err != nil {
        panic(err)
    }

    defer db.Close()

    // авторизация
    res, err := db.Query(fmt.Sprintf("SELECT * FROM `users` WHERE `email` = '%s'", email))
    result, error := db.Query(fmt.Sprintf("SELECT * FROM `users` WHERE `password` = '%s'", password))
    if err != nil || error != nil {
        panic(err)
    }

    posts = []User{}
    for res.Next() {
        var post User
        err = res.Scan(&post.Id, &post.Name, &post.Surname, &post.Email, &post.Number, &post.Password)
        if err != nil {
            panic(err)
        }
        if post.Email != FormEmail {
            fmt.Fprintf(w, "неправильная почта")
        }
    }
    for result.Next() {
        var post User
        error = res.Scan(&post.Id, &post.Name, &post.Surname, &post.Email, &post.Number, &post.Password)
        if error != nil {
            panic(err)
        }
        if post.Password != FormPassword {
            fmt.Fprintf(w, "неправильный пароль")
        }
    }
    http.Redirect(w, r, "/", http.StatusSeeOther)
}

html:

<form action="/log" method="post">
  <input type="email" name="email">
  <input type="password" name="password">
  <button>Войти</button>
</form>

Смысл таков: человек вводит email и пароль на форме, и нужно сверить с данными в БД. User-это структура созданная сверху, в которую присваиваются данные с полей таблицы. FormEmail и FormPassword это значения с полей формы, а email и password изначально пустые переменные типа с string. Ошибки не выводятся, к БД подключено правильно. Думаю я что то не то делаю, буду благодарен за каждую подсказку. Прошу прощения если вопрос глупый, я просто только учусь


Ответы (1 шт):

Автор решения: Senior Pomidor

я немного упростил ваши проверки, добавил ответ запроса, так как нельзя падать паникой внутри приложения))


func log(w http.ResponseWriter, r *http.Request) {
    FormEmail := r.FormValue("email")
    FormPassword := r.FormValue("password")
    // подключение
    db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:8889)/service")
    if err != nil {
        panic(err)
    }

    defer db.Close()

    // проверяем есть ли пользователь с заданным email + password
    res, err := db.Query("SELECT * FROM `users` WHERE `email` = '?' and password = '?'", FormEmail, FormPassword)
    if err != nil {
        fmt.Printf("%w", err)
        JSONError(500, "DB100 error code example", "DB error", w)
        return
    }
    
    // проверяем есть ли записи в БД.
    if !res.Next() {
        JSONError(413, "trololo", "user not found", w)
        return
    }
    
    // если дошли сюда, значит все ок, значит можно пропустить его дальше
    http.Redirect(w, r, "/", http.StatusSeeOther)
}


func JSONError(httpcode int, code, msg string, w http.ResponseWriter) {
    type Error struct {
        Code      *string `json:"code,omitempty"`
        Message   *string `json:"message,omitempty"`
    }
    
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    w.Header().Set("X-Content-Type-Options", "nosniff")
    w.WriteHeader(httpcode)
    json.NewEncoder(w).Encode(
        Error{
            Code:      &code,
            Message:   &msg,
        },
    )
}
→ Ссылка