dポイントプレゼントキャンペーン実施中!

PHP4ベースの勤怠管理システムみたいなものに、
各支社が自身のアクセスIDとパスでアクセスし、
日々、いろいろデータを登録しています。

この既存システムを流用し、各支社がログイン後、トップメニューに
PHP4+MySQLベースのアンケートフォームを設け、回答をMySQLに
登録するような仕組みを考えているのですが、ここでごく基本的な
疑問があります。

アンケートは、

Q1がチェックボックス→「q1」 varchar(1)
Q2がラジオボタン→「q2」 varchar(1)
Q3がテキストのフリーワード→「q3」 varchar(50)

のようになって、現状全てNULLなわけですが、
SQL部分はUPDATE文で作成するものでしょうか。

最初はINSERTで、二回目以降表示したとき(回答を変更修正したい時)
は、登録されているものを各フォームに復元しつつ、
全てUPDATE文で上書きというのが基本なのかと推測してますが、
NULLから回答値にUPDATEすれば、最初からUPDATE文しか用意しなくても
よいと思うのですけど。

ひいては、INSERT文の存在意義がよくわからなくなってきています。

このケースでは、最初にアンケートを表示し、回答がなされたら
INSERTでDBに登録、みたいにしなければだめなのですか?

A 回答 (5件)

一般的には、最初はinsertで、その後はupdate となりますね。

これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要になってしまいます。

そこで、MySQL 限定の話になりますが、それをいっぺんにおこなうことができるのがありまして、replace といいます。
primary key の設定など制約がありますが、当たり前の制約なので、そんなに難しくないと思います。

参考URL:http://mysql.speedbone.de/doc/refman/4.1/ja/repl …
    • good
    • 0
この回答へのお礼

duke13さん、御礼遅くなりました、今日、ようやく作業に戻ってきまして、
再度検討を始めたところです。わたしが不便というか質問したかったのは、
まさに
「これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要」
というところでした。
そこで、ご紹介のREPLACE文、入門書などをみてみましたら、まさに
本件にぴったりのように思います。

MySQL限定って、こんな需要がありそうなものを他のRDBには実装されて
いないのですかね。
ともかく、これで効率よく作れそうです、ありがとうございました。

お礼日時:2006/09/19 15:03

常道なのかどうかわかりませんが、


「INSERT IGNORE INTO テーブル」でプライマリーキーを
いれると、すでにデータがあれば無視され、データが
なければプライマリーだけのデータができますので
そこでUPDATE テーブル WHERE プライマリーが一致
のようにやれば、分岐は発生しません

この回答への補足

yamabejpさん、いつもお世話になります

> 常道なのかどうかわかりませんが、
> 「INSERT IGNORE INTO テーブル」でプライマリーキーを
> いれると、すでにデータがあれば無視され、データが
> なければプライマリーだけのデータができますので
> そこでUPDATE テーブル WHERE プライマリーが一致
> のようにやれば、分岐は発生しません

すみません、大変興味はあるのですが、具体的に想像できません。

アンケート格納テーブル(t_question)には
各支社のログインIDをプライマリキーとして収めますが、
これらのIDを、あらかじめt_questionにInsertしておけば
よいということでしょうか。

補足日時:2006/09/08 09:18
    • good
    • 0

スーツの単なるデザイナでプログラマではありませんが・・・一言。



勤怠管理データベースであれば、INSERT文は必須と思います。
単に、単一ページアンケートシステムではUPDATE文だけで事足ります。

問題は、回答をデータベース化するのかしないのか?
ここに尽きると思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

回答をメールで送られてくるようなものも考えましたが、
やはりDBに集約したいです。

集計がラクなのと、どこが未回答のチェックかわかりやすく、
なにより、既存のシステムの枠を活用できるからです。

システム自体は外注で専門業者が作ったので、当然Insert文は
各所で使われているわけですが、
わたしが勉強を兼ねて一時的なアンケートを作ることになりました。

わからないことを整理してみたことを、#2さんへの御礼に書いて
あります。もしよろしければご参照ください。

お礼日時:2006/09/07 15:52

どういう構造にしたいのかもう少し詳しく知りたい所ですが、一人に対して1つの回答しか許さない構造なのですよね?質問者様の内容ですと確かに初回回答時のみInsertで問題ないと思われます。

どちらにせよ初回にはInsertが必要になるのですが・・・。

>INSERT文の存在意義
新規にデータを追加する場合は必ず必要になりますが?
例えばアクセスログをDBに残したい場合など、予約システムな等であれば予約ログなど、使用用途は様々ですが重要なコマンドであることは確かです。
私もよくお世話になります(笑)

この回答への補足

ご回答ありがとうございました。

>どういう構造にしたいのかもう少し詳しく知りたい所ですが、
> 一人に対して1つの回答しか許さない構造なのですよね?

まさにその通りです。

ブラウザで東京支社の社員がシステムにログインして、
メニューに入ると、

-------------
東京支社
-------------
●勤怠管理 9月
●予算計画 9月
●連絡先
--------------

みたいな雰囲気で、当該支社のメニューが表示され、ここに

●アンケート
という項目を追加したいです(●は全てハイパーリンク)。

そしてアンケートページ(question.php)に遷移した際、

(1) 初めてこのアンケート画面を表示した、あるいは
  表示は初めてでなくても未回答

なのであれば、前質問が空白のフォームを出し、裏で動いている
PHPプログラムにはInsertモードのSQLを用意しなければならない
でしょう。例えば、以下のように。

回答者性別 ○男 ○女
回答者所属 [      ]

他方、

(2) 既に回答済みだが、誤りがあったので訂正、修正、更新
したいのであれば、裏のプログラムではUpdateモードである
ことを判別し、既存の回答をアンケートテーブルから読み
込んで表示してあげなければならないでしょう。例えば、

回答者性別 ◎男 ○女
回答者所属 [東京支社第一営業部]  のように。

この判断がわからないので、Insertモードなど経ず
一律にUPDATEモードで開けばいいんじゃないのかと思ったしだいです。
しかし、

> 新規にデータを追加する場合は必ず必要になりますが?

ということは、駄目ですね。

補足日時:2006/09/07 15:47
    • good
    • 0
この回答へのお礼

ばらばらとすみません。

アンケートに回答済みか未回答かは、
回答を収めたMySQLのテーブルにフラグを設けたり
するのが一般的でしょうか。

そのあたりの王道的手段を知りたいです。

未回答者用アンケート(Insertモード).php
回答済み用アンケート(Updateモード).php
と2種類用意し、
アンケートページに遷移する前に、ハイパーリンクの段階で
どっちを表示させるか切り替えるべきですかね?

あるいは、アンケート.php 内で、
if (回答済みフラグがたっている){
  UpdateモードのHTMLを展開し、さらに
  DBも読み込んで、既存の回答を表示
} elseif (まだ未回答である){
  InsertモードのHTMLを展開するだけ
}

みたいに処理を分けるとか?

お礼日時:2006/09/07 15:59

予め何件のデータが入るか判っていて、テーブルに回答数分の行がINSERTされているのであれば、UPDATE文だけでできると思いますが。



テーブルが作成されただけでは、行は存在しないので、最初の回答でINSERT→回答の変更でUPDATEが自然だと思います。
    • good
    • 0
この回答へのお礼

早速のレスありがとうございました。

やっぱりそうですよね。

InsertモードかUpdateモードかをどうやって
切り替えるかがよくわからないしだいです。

だったら、最初からInsert飛ばして
Updateモードオンリーで運用できるのでは?
と短絡的に考えました。

もう少し勉強してみます。ありがとうございました。

お礼日時:2006/09/07 15:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!