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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

3838閲覧

form入力した値をmysqlに追加する

退会済みユーザー

退会済みユーザー

総合スコア0

Go

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/05/31 04:44

編集2016/05/31 09:31

###前提・実現したいこと
login画面で入力したものをデータベースに保存したい。
db.execのqueryの後の値は保存されますが、formで入力した値が保存されていないので改善したいです。
###発生している問題・エラーメッセージ
コードの中に入れた値はデータベースに保存されるけれど、formで入力したものはなにもならない。

エラーメッセージ insert error: sql: expected 5 arguments, got 4

###該当のソースコード

go

1package main 2 3import( 4 5 "fmt" 6 "html/template" 7 "log" 8 "net/http" 9 "database/sql" 10 _"github.com/go-sql-driver/mysql" 11) 12 13type student struct{ 14 //id int `db:"id, primarykey, autoincrement"` 15 name string `db:"name size:255, uni"` 16 cardnum string `db:"cardnum, size:255, unique"` 17 seminar string `db:"seminar, size:255"` 18 password string `db:"password, size:255, unique"` 19} 20 21func login(w http.ResponseWriter, r *http.Request){ 22 fmt.Println("method:", r.Method) 23 if r.Method == "GET"{ 24 t, _ := template.ParseFiles("tmpl/login.gtpl") 25 t.Execute(w, nil) 26 }else{ 27 r.ParseForm() 28 fmt.Println("name:", template.HTMLEscapeString(r.Form.Get("name"))) 29 fmt.Println("cardnum:",template.HTMLEscapeString(r.Form.Get("cardnum"))) 30 fmt.Println("seminar:",template.HTMLEscapeString(r.Form.Get("seminar"))) 31 fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password"))) 32 template.HTMLEscape(w, []byte(r.Form.Get("username"))) 33 34 } 35} 36 37func insert(db *sql.DB) { 38 query := "INSERT INTO student values(null, ?, ?, ?, ?)" 39 result, err := db.Exec(query,"name","cardnum", "seminar", "password") 40 if err != nil { 41 log.Fatal("insert error: ", err) 42 } 43 if lastId, lerr := result.LastInsertId(); lerr != nil { // unsupport... 44 fmt.Println("insert last id: %d", lastId) 45 } 46} 47 48func getDB()(db *sql.DB) { 49 50 db, err := sql.Open("mysql", "root:passwprd@/dbname") 51 if err !=nil{ 52 log.Fatal("open error: %v", err) 53 } 54 return db 55} 56 57func main() { 58 59 fmt.Println("** mysql start **") 60 db := getDB() 61 62 insert(db) 63 64 defer db.Close() 65 66 fmt.Println("** mysql end **") 67 68 //http.HandleFunc("/", sayhelloName) 69 http.HandleFunc("/", login) 70 err := http.ListenAndServe(":3000", nil) 71 if err != nil{ 72 log.Fatal("ListenAndServe:",err) 73 } 74} 75 76login.gtpl 77 78<!DOCTYPE html> 79 80<html> 81<head> 82<title></title> 83</head> 84<body> 85<form action="/login" method="post"> 86 名前:<input type="text" name="name"> 87 学籍番号:<input type="text" name="cardnum"> 88 所属ゼミ:<input type="text" name="seminar"> 89 パスワード:<input type="password" name="password"> 90 <input type="submit" value="ログイン"> 91</form> 92</body> 93</html> 94

###試したこと
課題に対してアプローチしたことを記載してください
valueの部分や、execの部分を変えてみた。
他のinsertの仕方も試してはみたがダメだった。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/05/31 05:19

テーブル定義の記載がされていないです。 DBがらみの不具合は、テーブル定義のミスなどもあり得るので、 show create table student; の結果を追記すると良いのではないでしょうか?
退会済みユーザー

退会済みユーザー

2016/05/31 06:25

記述しましたが、代わりないようです。 db.execの値が保存されているのですが、その部分にformのpostで受け取った値を格納したいのですが、なかなか思いつかず...
退会済みユーザー

退会済みユーザー

2016/05/31 06:53

開き方が悪かったです。 記述するというのはここにです。 テーブル定義とズレがあるなどの理由だとしたら、どういう定義になっているのかわからないと回答の書きようがないので・・・
退会済みユーザー

退会済みユーザー

2016/05/31 06:57

勘違いしてしまいすみませんでした。
guest

回答2

0

go言語については詳しくないのですが、
SQLは

INSERT INTO student values(null, ?, ?, ?, ?);

ではないかなと思います。

DBの制約などに引っかかっていないか確認してください。

DB関係でひっかかる場合は、言語を通さずmysqlに直接ログインし、想定されるinsert文を直接発行した方がわかりやすいかと思います。

あと POSTしている値のkeyがnameで、受け取ろうとしている値のkeyがsnameというものになっているようですが・・・?

投稿2016/05/31 07:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/05/31 07:34

直しましたが、やはり入力した値ではなく、result, err := db.Exec(query,"name","cardnum", "seminar", "password")に書いたものがdbに格納されてしまいます。 postしているのはterminalに出力されはするのですが.. 間違えが多く申し訳ありません。
退会済みユーザー

退会済みユーザー

2016/05/31 08:15

go言語に詳しくないので、本当に申し訳ない部分はあるのですが、 この記述で、func insertにおいてフォームで送信した値を取得できているのでしょうか? go言語のDB操作を自分が調べた限りでは、これではinsert文に'name'という文字列を割り当てているだけのように見えるのですが。 > r.Form.Get("name") などの値をfunc insertにおいて取得、指定しなければならないのではないでしょうか?
退会済みユーザー

退会済みユーザー

2016/05/31 14:03 編集

とんでもないです。 formから入力された値は取得できていません。 今はqueryのあとのstringがそのままdbに格納されている形です。 なので、queryの後をformから受け取った値を渡してあげる形になると思うのですが、よくわかっておらずといった状態なので、すみません。 そうですね。そう言った値を指定する必要があるみたいです。 私の現状の能力的に足りていなさすぎているので。
guest

0

ベストアンサー

insert error: Error 1062: Duplicate entry 'name' for key 'name'

nameが重複しているというエラーです。
nameに主キーかユニークキーの制約をつけていて、入力したnameが既に存在していると出るエラーです。

投稿2016/05/31 04:51

icham

総合スコア559

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

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

退会済みユーザー

退会済みユーザー

2016/05/31 04:53

確かにそうでした、ありがとうございます。
icham

2016/06/01 02:59

まずは、ここを参考にしてformからの値を取得できるようにしてみましょう。 http://qiita.com/peketamin/items/295b2c2bdcf073285acf POSTされた値を取得出来るようになったら > result, err := db.Exec(query,"name","cardnum", "seminar", "password") の"name", "cardnum"…を取得した値の変数に置き換えれば出来ると思います。 ちなみにGoは触ったことなく、いま調べただけですので間違っていたらごめんなさい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問