Fix answer submission failing

This commit is contained in:
illyum 2024-09-03 23:36:02 -06:00
parent 62f2f6002b
commit 8d215f8881

58
main.go
View File

@ -6,10 +6,10 @@ import (
"html/template"
"log"
"net/http"
_ "github.com/mattn/go-sqlite3"
)
type Question struct {
ID int
QuestionText string
@ -19,7 +19,7 @@ type Question struct {
var db *sql.DB
func renderForm(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query("SELECT question_text, question_type FROM questions ORDER BY question_order")
rows, err := db.Query("SELECT id, question_text, question_type FROM questions ORDER BY question_order")
if err != nil {
log.Printf("Error fetching questions: %v\n", err)
http.Error(w, "Failed to fetch form questions", http.StatusInternalServerError)
@ -31,7 +31,7 @@ func renderForm(w http.ResponseWriter, r *http.Request) {
for rows.Next() {
var question Question
err := rows.Scan(&question.QuestionText, &question.QuestionType)
err := rows.Scan(&question.ID, &question.QuestionText, &question.QuestionType)
if err != nil {
log.Printf("Error scanning question: %v\n", err)
continue
@ -49,43 +49,49 @@ func handleFormSubmit(w http.ResponseWriter, r *http.Request) {
return
}
r.ParseForm()
rows, err := db.Query("SELECT id FROM questions")
err := r.ParseForm()
if err != nil {
log.Printf("Error fetching questions: %v\n", err)
http.Error(w, "Failed to fetch questions", http.StatusInternalServerError)
log.Printf("Error parsing form: %v\n", err)
http.Error(w, "Failed to parse form", http.StatusInternalServerError)
return
}
defer rows.Close()
insertAnswerQuery := `INSERT INTO answers (question_id, answer) VALUES (?, ?)`
var questionID int
for rows.Next() {
err := rows.Scan(&questionID)
tx, err := db.Begin()
if err != nil {
log.Printf("Error scanning question ID: %v\n", err)
log.Printf("Error starting transaction: %v\n", err)
http.Error(w, "Failed to save answers", http.StatusInternalServerError)
return
}
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
for key, values := range r.Form {
if len(key) > 7 && key[:7] == "custom_" {
var questionID int
_, err := fmt.Sscanf(key, "custom_%d", &questionID)
if err != nil {
log.Printf("Error parsing question ID from field name %s: %v\n", key, err)
continue
}
fieldName := fmt.Sprintf("custom_%d", questionID)
fieldValue := r.FormValue(fieldName)
if fieldValue != "" {
insertQuery := `INSERT INTO answers (question_id, answer) VALUES (?, ?)`
_, err = db.Exec(insertQuery, questionID, fieldValue)
answer := values[0]
_, err = tx.Exec(insertAnswerQuery, questionID, answer)
if err != nil {
log.Printf("Error saving answer: %v\n", err)
http.Error(w, "Failed to save answer", http.StatusInternalServerError)
log.Printf("Error saving answer for question %d: %v\n", questionID, err)
http.Error(w, "Failed to save answers", http.StatusInternalServerError)
return
}
} else {
log.Printf("No answer found for question %d", questionID)
}
}
fmt.Fprintf(w, "Thank you for your submission!")
}
func handleAdmin(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query(`
SELECT q.question_text, a.answer
@ -142,7 +148,6 @@ func handleAddQuestion(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/manage", http.StatusSeeOther)
}
func handleManage(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query("SELECT id, question_text, question_type FROM questions ORDER BY question_order")
if err != nil {
@ -189,7 +194,6 @@ func handleRemoveQuestion(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/manage", http.StatusSeeOther)
}
func main() {
var err error
@ -211,7 +215,7 @@ func main() {
question_id INTEGER NOT NULL,
answer TEXT NOT NULL,
FOREIGN KEY (question_id) REFERENCES questions(id)
);
);
`
_, err = db.Exec(createTableQueries)