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

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

ただいまの
回答率

90.23%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,622
退会済みユーザー

退会済みユーザー

前提・実現したいこと

login画面で入力したものをデータベースに保存したい。
db.execのqueryの後の値は保存されますが、formで入力した値が保存されていないので改善したいです。

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

コードの中に入れた値はデータベースに保存されるけれど、formで入力したものはなにもならない。

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

該当のソースコード

package main

import(

    "fmt"
    "html/template"
    "log"
    "net/http"
    "database/sql"
    _"github.com/go-sql-driver/mysql"
)

type student struct{
    //id int `db:"id, primarykey, autoincrement"`
    name string `db:"name size:255, uni"`
    cardnum string `db:"cardnum, size:255, unique"`
    seminar string `db:"seminar, size:255"`
    password string `db:"password, size:255, unique"`
}

func login(w http.ResponseWriter, r *http.Request){
    fmt.Println("method:", r.Method)
    if r.Method == "GET"{
        t, _ := template.ParseFiles("tmpl/login.gtpl")
        t.Execute(w, nil)
    }else{
        r.ParseForm()
        fmt.Println("name:", template.HTMLEscapeString(r.Form.Get("name")))
        fmt.Println("cardnum:",template.HTMLEscapeString(r.Form.Get("cardnum")))
        fmt.Println("seminar:",template.HTMLEscapeString(r.Form.Get("seminar")))
        fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))
        template.HTMLEscape(w, []byte(r.Form.Get("username")))

    }
}

func insert(db *sql.DB) {
    query := "INSERT INTO student values(null, ?, ?, ?, ?)"
    result, err := db.Exec(query,"name","cardnum", "seminar", "password")
    if err != nil {
        log.Fatal("insert error: ", err)
    }
    if lastId, lerr := result.LastInsertId(); lerr != nil { // unsupport...
        fmt.Println("insert last id: %d", lastId)
    }
}

func getDB()(db *sql.DB) {

    db, err := sql.Open("mysql", "root:passwprd@/dbname")
    if err !=nil{
        log.Fatal("open error: %v", err)
    }
    return db
}

func main() {

    fmt.Println("** mysql start **")
    db := getDB()

    insert(db)

    defer db.Close()

    fmt.Println("** mysql end **")

    //http.HandleFunc("/", sayhelloName)
    http.HandleFunc("/", login)
    err := http.ListenAndServe(":3000", nil)
    if err != nil{
        log.Fatal("ListenAndServe:",err)
    }
}

login.gtpl

<!DOCTYPE html>

<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
    名前:<input type="text" name="name">
    学籍番号:<input type="text" name="cardnum">
    所属ゼミ:<input type="text" name="seminar">
    パスワード:<input type="password" name="password">
    <input type="submit" value="ログイン">
</form>
</body>
</html>

試したこと

課題に対してアプローチしたことを記載してください
valueの部分や、execの部分を変えてみた。
他のinsertの仕方も試してはみたがダメだった。

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Sheabah

    2016/05/31 14:19

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/05/31 15:25

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

    キャンセル

  • Sheabah

    2016/05/31 15:53

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/05/31 15:57

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

    キャンセル

回答 2

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/31 13:53

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

    キャンセル

  • 2016/06/01 11:59

    まずは、ここを参考にしてformからの値を取得できるようにしてみましょう。
    http://qiita.com/peketamin/items/295b2c2bdcf073285acf

    POSTされた値を取得出来るようになったら
    > result, err := db.Exec(query,"name","cardnum", "seminar", "password")
    の"name", "cardnum"…を取得した値の変数に置き換えれば出来ると思います。

    ちなみにGoは触ったことなく、いま調べただけですので間違っていたらごめんなさい。

    キャンセル

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/31 16:34

    直しましたが、やはり入力した値ではなく、result, err := db.Exec(query,"name","cardnum", "seminar", "password")に書いたものがdbに格納されてしまいます。
    postしているのはterminalに出力されはするのですが..

    間違えが多く申し訳ありません。

    キャンセル

  • 2016/05/31 17:15

    go言語に詳しくないので、本当に申し訳ない部分はあるのですが、
    この記述で、func insertにおいてフォームで送信した値を取得できているのでしょうか?
    go言語のDB操作を自分が調べた限りでは、これではinsert文に'name'という文字列を割り当てているだけのように見えるのですが。

    > r.Form.Get("name")

    などの値をfunc insertにおいて取得、指定しなければならないのではないでしょうか?

    キャンセル

  • 2016/05/31 19:10 編集

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

    私の現状の能力的に足りていなさすぎているので。

    キャンセル

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる