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...
-
phpにて出欠登録管理を作成して...
-
検索結果が多い時の分割(件数...
-
テーブルに行を追加
-
DB Error: no such field
-
日またぎの計算
-
PHP/HTMLページ印刷について
-
実行時エラー3131 FROM 句の構...
-
<VB.NET>INSERT文でDBにデータ...
-
VBAをつかってクエリの情報を抽...
-
php データ削除
-
dbに登録したデータをphpのプル...
-
codeigniter 複数モデルでトラ...
-
Pro*Cの構文エラー
-
ASPでRecordCountが使用でき...
-
SQL文が実行できません
-
VBA ACCESS SQL...
-
mysql_query等でレコード数を変...
-
php mysqlで作ったデータをgoog...
-
JAVA SQLServerException 列名 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
変数にNULLを代入したい
-
phpにて出欠登録管理を作成して...
-
phpでテーブルを作る際変数によ...
-
csvをDBへ読み込んだら、NULLが...
-
SQLで返り値が空とでる
-
ヒアドキュメントでSQLを書く事...
-
php sqlite count 列数取得
-
OracleからAccessへのインポート
-
変数を組み入れたい
-
Accessへ日付をINSERT
-
任意の値の取得
-
日またぎの計算
-
PHPでいいね機能を作りたいので...
-
クエリObjectをforeachで回す時...
-
PHP PDOを利用してカラムの削除...
-
会員番号等に利用するダブらな...
-
access → Oracleへのデータ移...
-
トランザクション処理
-
SQL CASE 文について
おすすめ情報