
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に登録、みたいにしなければだめなのですか?
No.5ベストアンサー
- 回答日時:
一般的には、最初はinsertで、その後はupdate となりますね。
これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要になってしまいます。そこで、MySQL 限定の話になりますが、それをいっぺんにおこなうことができるのがありまして、replace といいます。
primary key の設定など制約がありますが、当たり前の制約なので、そんなに難しくないと思います。
参考URL:http://mysql.speedbone.de/doc/refman/4.1/ja/repl …
duke13さん、御礼遅くなりました、今日、ようやく作業に戻ってきまして、
再度検討を始めたところです。わたしが不便というか質問したかったのは、
まさに
「これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要」
というところでした。
そこで、ご紹介のREPLACE文、入門書などをみてみましたら、まさに
本件にぴったりのように思います。
MySQL限定って、こんな需要がありそうなものを他のRDBには実装されて
いないのですかね。
ともかく、これで効率よく作れそうです、ありがとうございました。
No.4
- 回答日時:
常道なのかどうかわかりませんが、
「INSERT IGNORE INTO テーブル」でプライマリーキーを
いれると、すでにデータがあれば無視され、データが
なければプライマリーだけのデータができますので
そこでUPDATE テーブル WHERE プライマリーが一致
のようにやれば、分岐は発生しません
この回答への補足
yamabejpさん、いつもお世話になります
> 常道なのかどうかわかりませんが、
> 「INSERT IGNORE INTO テーブル」でプライマリーキーを
> いれると、すでにデータがあれば無視され、データが
> なければプライマリーだけのデータができますので
> そこでUPDATE テーブル WHERE プライマリーが一致
> のようにやれば、分岐は発生しません
すみません、大変興味はあるのですが、具体的に想像できません。
アンケート格納テーブル(t_question)には
各支社のログインIDをプライマリキーとして収めますが、
これらのIDを、あらかじめt_questionにInsertしておけば
よいということでしょうか。
No.3
- 回答日時:
スーツの単なるデザイナでプログラマではありませんが・・・一言。
勤怠管理データベースであれば、INSERT文は必須と思います。
単に、単一ページアンケートシステムではUPDATE文だけで事足ります。
問題は、回答をデータベース化するのかしないのか?
ここに尽きると思います。
回答ありがとうございました。
回答をメールで送られてくるようなものも考えましたが、
やはりDBに集約したいです。
集計がラクなのと、どこが未回答のチェックかわかりやすく、
なにより、既存のシステムの枠を活用できるからです。
システム自体は外注で専門業者が作ったので、当然Insert文は
各所で使われているわけですが、
わたしが勉強を兼ねて一時的なアンケートを作ることになりました。
わからないことを整理してみたことを、#2さんへの御礼に書いて
あります。もしよろしければご参照ください。
No.2
- 回答日時:
どういう構造にしたいのかもう少し詳しく知りたい所ですが、一人に対して1つの回答しか許さない構造なのですよね?質問者様の内容ですと確かに初回回答時のみInsertで問題ないと思われます。
どちらにせよ初回にはInsertが必要になるのですが・・・。>INSERT文の存在意義
新規にデータを追加する場合は必ず必要になりますが?
例えばアクセスログをDBに残したい場合など、予約システムな等であれば予約ログなど、使用用途は様々ですが重要なコマンドであることは確かです。
私もよくお世話になります(笑)
この回答への補足
ご回答ありがとうございました。
>どういう構造にしたいのかもう少し詳しく知りたい所ですが、
> 一人に対して1つの回答しか許さない構造なのですよね?
まさにその通りです。
ブラウザで東京支社の社員がシステムにログインして、
メニューに入ると、
-------------
東京支社
-------------
●勤怠管理 9月
●予算計画 9月
●連絡先
--------------
みたいな雰囲気で、当該支社のメニューが表示され、ここに
●アンケート
という項目を追加したいです(●は全てハイパーリンク)。
そしてアンケートページ(question.php)に遷移した際、
(1) 初めてこのアンケート画面を表示した、あるいは
表示は初めてでなくても未回答
なのであれば、前質問が空白のフォームを出し、裏で動いている
PHPプログラムにはInsertモードのSQLを用意しなければならない
でしょう。例えば、以下のように。
回答者性別 ○男 ○女
回答者所属 [ ]
他方、
(2) 既に回答済みだが、誤りがあったので訂正、修正、更新
したいのであれば、裏のプログラムではUpdateモードである
ことを判別し、既存の回答をアンケートテーブルから読み
込んで表示してあげなければならないでしょう。例えば、
回答者性別 ◎男 ○女
回答者所属 [東京支社第一営業部] のように。
この判断がわからないので、Insertモードなど経ず
一律にUPDATEモードで開けばいいんじゃないのかと思ったしだいです。
しかし、
> 新規にデータを追加する場合は必ず必要になりますが?
ということは、駄目ですね。
ばらばらとすみません。
アンケートに回答済みか未回答かは、
回答を収めたMySQLのテーブルにフラグを設けたり
するのが一般的でしょうか。
そのあたりの王道的手段を知りたいです。
未回答者用アンケート(Insertモード).php
回答済み用アンケート(Updateモード).php
と2種類用意し、
アンケートページに遷移する前に、ハイパーリンクの段階で
どっちを表示させるか切り替えるべきですかね?
あるいは、アンケート.php 内で、
if (回答済みフラグがたっている){
UpdateモードのHTMLを展開し、さらに
DBも読み込んで、既存の回答を表示
} elseif (まだ未回答である){
InsertモードのHTMLを展開するだけ
}
みたいに処理を分けるとか?
No.1
- 回答日時:
予め何件のデータが入るか判っていて、テーブルに回答数分の行がINSERTされているのであれば、UPDATE文だけでできると思いますが。
テーブルが作成されただけでは、行は存在しないので、最初の回答でINSERT→回答の変更でUPDATEが自然だと思います。
早速のレスありがとうございました。
やっぱりそうですよね。
InsertモードかUpdateモードかをどうやって
切り替えるかがよくわからないしだいです。
だったら、最初からInsert飛ばして
Updateモードオンリーで運用できるのでは?
と短絡的に考えました。
もう少し勉強してみます。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- PHP php エラー 2 2022/10/23 16:43
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- PostgreSQL SQLでUPSERTを一度に複数行やる方法 3 2022/03/25 15:17
- MySQL UPDATE my_items SET item_name '赤い,甘い,ケーキ' WHERE id 1 2023/01/03 09:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
クエリObjectをforeachで回す時...
-
MySQLでのUNIQUE制約の削除
-
変数にNULLを代入したい
-
php複数キーワード検索
-
mysqlのinsert文について、ご指...
-
mysql_queryが動かなくて困って...
-
stringaddslashes 半角¥が消える
-
テキストボックスに入れた内容...
-
PHP+MySQLでの検索結果の横並び...
-
C#でDBの特定列をUpdate
-
<select> の<option value>が指...
-
Pro*Cの構文エラー
-
大変困っております。PHP ...
-
insert1つの処理でもトランザ...
-
WHILE中で前と重複したら間引く...
-
Q&Aサイトを作成していてURLの...
-
PDOで取得される値がすべて文字...
-
「mysqlclient」の事が分からな...
-
エラー3011
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
csvをDBへ読み込んだら、NULLが...
-
変数にNULLを代入したい
-
カラムにデータがあるかないか...
-
ヒアドキュメントでSQLを書く事...
-
3つのテーブルを結合したSELECT文
-
MYSQLのレコードの数を表示した...
-
PHPでPostgreSQLのテーブルを表...
-
php sqlite count 列数取得
-
クエリObjectをforeachで回す時...
-
OracleからAccessへのインポート
-
PHP PDOを利用してカラムの削除...
-
DB Error: no such field
-
テーブルを使用してレイアウト...
-
PHPシステムでSQLのUPDATEがあ...
-
テーブルのカラムの属性を変え...
-
重複データをカウントするのに...
-
変数を組み入れたい
-
phpでテーブルを作る際変数によ...
-
phpの掲示板でレスがあったスレ...
おすすめ情報