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

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

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

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

Q&A

解決済

2回答

1002閲覧

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

bon96

総合スコア21

Go

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

0グッド

0クリップ

投稿2022/07/20 02:34

前提

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

  • 開発環境

Windows10、Go 1.18.3、PostgreSQL14 

実現したいこと

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

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

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

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

  • 実行前

Image from Gyazo

  • 実行後

Image from Gyazo

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

該当のソースコード

Go

1//main.go 2//create(WorkItemCreate)は問題なくできます 3 4package main 5 6import ( 7 "database/sql" 8 "log" 9 "net/http" 10 11 //"strconv" 12 _ "github.com/lib/pq" 13 "text/template" 14 "time" 15) 16 17type WorkItem struct { 18 Id int // ユーザーID 19 WorkdateTime time.Time 20 TimeType string // 出勤時間 or 退勤時間 21} 22 23func main() { 24 http.HandleFunc("/", Index) 25 http.HandleFunc("/create", WorkItemCreate) 26 http.HandleFunc("/edit", WorkItemEdit) 27 http.HandleFunc("/update", WorkItemUpdate) 28 http.ListenAndServe("localhost:8080", nil) 29} 30 31func dbConn() (db *sql.DB) { 32 psqlInfo := "host=localhost user=ams1 password=ams1 dbname=ams1 port=5432 sslmode=disable" 33 db, err := sql.Open("postgres", psqlInfo) 34 if err != nil { 35 panic(err.Error()) 36 } 37 return db 38} 39 40type IndexData struct { 41 Day int // 時間 42 Timetype string // 出勤 or 退勤 43} 44 45func Index(w http.ResponseWriter, r *http.Request) { 46 tmpl, err := template.ParseFiles("templates/index.html") 47 if err != nil { 48 log.Fatal(err) 49 } 50 db := dbConn() 51 52 rows, err := db.Query("SELECT * from workitems WHERE Workdatetime between '2022-07-01' and '2022-07-31' ORDER BY Workdatetime ASC;") 53 if err != nil { 54 log.Fatal(err) 55 } 56 defer rows.Close() 57 58 MapRecords := make(map[IndexData]WorkItem) 59 60 for rows.Next() { 61 var record WorkItem 62 err = rows.Scan(&record.Id, &record.WorkdateTime, &record.TimeType) 63 index := IndexData{record.WorkdateTime.Day(), record.TimeType} 64 if err != nil { 65 log.Fatal(err) 66 } 67 MapRecords[index] = record 68 } 69 70 if err := rows.Err(); err != nil { 71 log.Fatal(err) 72 } 73 74 tmpl.Execute(w, MapRecords) 75 76} 77 78func WorkItemCreate(w http.ResponseWriter, r *http.Request) { 79 db := dbConn() 80 81 if r.Method == "POST" { 82 workdatetime := r.FormValue("workdatetime") 83 timetype := r.FormValue("timetype") 84 85 insert, err := db.Prepare("INSERT INTO workitems(workdatetime, timetype) VALUES($1,$2);") 86 if err != nil { 87 log.Fatal(err) 88 } 89 insert.Exec(workdatetime, timetype) 90 } 91 92 http.Redirect(w, r, "/", 301) 93} 94 95func WorkItemEdit(w http.ResponseWriter, r *http.Request) { 96 db := dbConn() 97 98 uId := r.URL.Query().Get("id") 99 rows, err := db.Query("SELECT * from workitems WHERE id=$1;", uId) 100 if err != nil { 101 log.Fatal(err) 102 } 103 defer rows.Close() 104 105 EditRecord := WorkItem{} 106 for rows.Next() { 107 var item WorkItem 108 err = rows.Scan(&item.Id, &item.WorkdateTime, &item.TimeType) 109 if err != nil { 110 log.Fatal(err) 111 } 112 EditRecord = item 113 } 114 115 tmpl, err := template.ParseFiles("templates/edit.html") 116 if err != nil { 117 log.Fatal(err) 118 } 119 tmpl.Execute(w, EditRecord) 120} 121 122// 今回問題としているコード 123func WorkItemUpdate(w http.ResponseWriter, r *http.Request) { 124 _, err := template.ParseFiles("templates/edit.html") 125 if err != nil { 126 log.Fatal(err) 127 } 128 db := dbConn() 129 130 if r.Method == "POST" { 131 workdatetime := r.FormValue("workdatetime") 132 timetype := r.FormValue("timetype") 133 134 udt, err := db.Prepare("UPDATE workitems SET workdatetime=$1,timetype=$2 WHERE id=$3;") 135 if err != nil { 136 log.Fatal(err) 137 } 138 udt.Exec(workdatetime, timetype) 139 } 140 http.Redirect(w, r, "/", 301) 141} 142

html

1//index.html 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="utf-8"> 7 <title>勤怠管理システム</title> 8 <link rel="stylesheet" href="/static/css/index.css"> 9 </head> 10 <body> 11 <div class="header"> 12 </div> 13 <div> 14 <form action="/create" method="POST"> 15 <input type="datetime-local" name="workdatetime" value="2022-07-01T09:00"> 16 <input type="radio" name="timetype" value="attendance">出勤 17 <input type="radio" name="timetype" value="leave">退勤 18 <input type="submit" value="送信"> 19 </form> 20 </div> 21 <div> 22 {{ range .}} 23 <ul> 24 <li>{{ .WorkdateTime }}</li><a href="/edit?id={{ .Id }}">Edit</a> 25 </ul> 26 {{ end }} 27 </div> 28 </body> 29 </html>

html

1//edit.html 2 3<!DOCTYPE html> 4<html lang="en"> 5 <head> 6 <meta charset="utf-8"> 7 <title>勤怠管理システム</title> 8 <link rel="stylesheet" href="/static/css/index.css"> 9 </head> 10 <body> 11 <div class="header"> 12 </div> 13 <div> 14 <ul> 15 <li>{{ .WorkdateTime }}</li></a> 16 </ul> 17 </div> 18 <div> 19 <h2>勤怠の修正</h2> 20 <form action="/update?id={{.Id}}" method="POST"> 21 <input type="datetime-local" name="workdatetime" value="2022-07-01T09:00"> 22 <input type="radio" name="timetype" value="attendance">出勤 23 <input type="radio" name="timetype" value="leave">退勤 24 <input type="submit" value="変更する"> 25 </form> 26 </div> 27 </body> 28</html> 29 30

試したこと

  • デバッグ

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

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

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

  • その他

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

補足情報

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

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

回答2

0

解決したようですが1つ補足を。

tmpl.Execute(...)insert.Exec(...)udt.Exec(...)などの戻り値のエラーを無視しないようにしましょう。

そうしておけば、パラメータ不足であったことなどもエラーメッセージで気づけたであろうと予想されます。

投稿2022/07/20 06:20

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bon96

2022/07/20 06:33

コメントありがとうございます。そのように実装してみます。 不慣れなので、その件でもしかしたらまた質問するかもしれません(笑)
guest

0

自己解決

WorkItemUpdate

1 2 id := r.FormValue("id") 3 workdatetime := r.FormValue("workdatetime") 4 timetype := r.FormValue("timetype") 5 6 udt, err := db.Prepare("UPDATE workitems SET workdatetime=$1,timetype=$2 WHERE id=$3;") 7 if err != nil { 8 log.Fatal(err) 9 } 10 udt.Exec(workdatetime, timetype, id)

「id := r.FormValue("id")」とudt.Exec(workdatetime, timetype, id)の「id」を追加することで保存できました!
melian様、ありがとうございました。

投稿2022/07/20 03:11

編集2022/07/20 03:13
bon96

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問