質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

解決済

[Go]更新機能の実装がDBに保存されない

bon96
bon96

総合スコア21

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

2回答

0リアクション

0クリップ

531閲覧

投稿2022/07/20 02:34

前提

Go言語の標準ライブラリを使って簡単な勤怠管理システムを作っています。
出退勤のデータを更新(編集)する実装で、受け取ったデータがDBに保存されません。

  • 開発環境

Windows10、Go 1.18.3、PostgreSQL14 

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 更新機能を動作するようにする

発生している問題・エラーメッセージ

エラーは出ていないが、更新はされていない

  • 実行前

Image from Gyazo

  • 実行後

Image from Gyazo

(DB)更新されていません
Image from Gyazo

該当のソースコード

Go

//main.go //create(WorkItemCreate)は問題なくできます package main import ( "database/sql" "log" "net/http" //"strconv" _ "github.com/lib/pq" "text/template" "time" ) type WorkItem struct { Id int // ユーザーID WorkdateTime time.Time TimeType string // 出勤時間 or 退勤時間 } func main() { http.HandleFunc("/", Index) http.HandleFunc("/create", WorkItemCreate) http.HandleFunc("/edit", WorkItemEdit) http.HandleFunc("/update", WorkItemUpdate) http.ListenAndServe("localhost:8080", nil) } func dbConn() (db *sql.DB) { psqlInfo := "host=localhost user=ams1 password=ams1 dbname=ams1 port=5432 sslmode=disable" db, err := sql.Open("postgres", psqlInfo) if err != nil { panic(err.Error()) } return db } type IndexData struct { Day int // 時間 Timetype string // 出勤 or 退勤 } func Index(w http.ResponseWriter, r *http.Request) { tmpl, err := template.ParseFiles("templates/index.html") if err != nil { log.Fatal(err) } db := dbConn() rows, err := db.Query("SELECT * from workitems WHERE Workdatetime between '2022-07-01' and '2022-07-31' ORDER BY Workdatetime ASC;") if err != nil { log.Fatal(err) } defer rows.Close() MapRecords := make(map[IndexData]WorkItem) for rows.Next() { var record WorkItem err = rows.Scan(&record.Id, &record.WorkdateTime, &record.TimeType) index := IndexData{record.WorkdateTime.Day(), record.TimeType} if err != nil { log.Fatal(err) } MapRecords[index] = record } if err := rows.Err(); err != nil { log.Fatal(err) } tmpl.Execute(w, MapRecords) } func WorkItemCreate(w http.ResponseWriter, r *http.Request) { db := dbConn() if r.Method == "POST" { workdatetime := r.FormValue("workdatetime") timetype := r.FormValue("timetype") insert, err := db.Prepare("INSERT INTO workitems(workdatetime, timetype) VALUES($1,$2);") if err != nil { log.Fatal(err) } insert.Exec(workdatetime, timetype) } http.Redirect(w, r, "/", 301) } func WorkItemEdit(w http.ResponseWriter, r *http.Request) { db := dbConn() uId := r.URL.Query().Get("id") rows, err := db.Query("SELECT * from workitems WHERE id=$1;", uId) if err != nil { log.Fatal(err) } defer rows.Close() EditRecord := WorkItem{} for rows.Next() { var item WorkItem err = rows.Scan(&item.Id, &item.WorkdateTime, &item.TimeType) if err != nil { log.Fatal(err) } EditRecord = item } tmpl, err := template.ParseFiles("templates/edit.html") if err != nil { log.Fatal(err) } tmpl.Execute(w, EditRecord) } // 今回問題としているコード func WorkItemUpdate(w http.ResponseWriter, r *http.Request) { _, err := template.ParseFiles("templates/edit.html") if err != nil { log.Fatal(err) } db := dbConn() if r.Method == "POST" { workdatetime := r.FormValue("workdatetime") timetype := r.FormValue("timetype") udt, err := db.Prepare("UPDATE workitems SET workdatetime=$1,timetype=$2 WHERE id=$3;") if err != nil { log.Fatal(err) } udt.Exec(workdatetime, timetype) } http.Redirect(w, r, "/", 301) }

html

//index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>勤怠管理システム</title> <link rel="stylesheet" href="/static/css/index.css"> </head> <body> <div class="header"> </div> <div> <form action="/create" method="POST"> <input type="datetime-local" name="workdatetime" value="2022-07-01T09:00"> <input type="radio" name="timetype" value="attendance">出勤 <input type="radio" name="timetype" value="leave">退勤 <input type="submit" value="送信"> </form> </div> <div> {{ range .}} <ul> <li>{{ .WorkdateTime }}</li><a href="/edit?id={{ .Id }}">Edit</a> </ul> {{ end }} </div> </body> </html>

html

//edit.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>勤怠管理システム</title> <link rel="stylesheet" href="/static/css/index.css"> </head> <body> <div class="header"> </div> <div> <ul> <li>{{ .WorkdateTime }}</li></a> </ul> </div> <div> <h2>勤怠の修正</h2> <form action="/update?id={{.Id}}" method="POST"> <input type="datetime-local" name="workdatetime" value="2022-07-01T09:00"> <input type="radio" name="timetype" value="attendance">出勤 <input type="radio" name="timetype" value="leave">退勤 <input type="submit" value="変更する"> </form> </div> </body> </html>

試したこと

  • デバッグ

WorkItemCreate関数とWorkItemUpdate関数とで同様の結果がでました。

  • <form action="/update?id={{.Id}}" method="POST"> の{{ }}部分を変更

{{ .workitem.Id }}などにするとブラウザ上にform文ごと表示されなくなりました。

  • その他

WorkItemUpdate関数内のworkdatetimeなどの頭文字を大文字にするなど

補足情報

関数内にformで入力したデータは渡せています。
そのため、main.goでの記述は問題ないんじゃないかと思っています。

以上、どなたか助言をいただけると嬉しいです。
よろしくお願いします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

melian

2022/07/20 03:00

udt, err := db.Prepare("UPDATE workitems SET workdatetime=$1,timetype=$2 WHERE id=$3;") Prepare で id を指定していますが、 udt.Exec(workdatetime, timetype) Id が渡されていない様に見受けられます。
bon96

2022/07/20 03:08

解決できました。ありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。