• ベストアンサー

PHPシステムでSQLのUPDATEがあればINSERTはいらないと思うのですけど?

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に登録、みたいにしなければだめなのですか?

  • PHP
  • 回答数5
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • duke13
  • ベストアンサー率100% (1/1)
回答No.5

一般的には、最初はinsertで、その後はupdate となりますね。これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要になってしまいます。 そこで、MySQL 限定の話になりますが、それをいっぺんにおこなうことができるのがありまして、replace といいます。 primary key の設定など制約がありますが、当たり前の制約なので、そんなに難しくないと思います。

参考URL:
http://mysql.speedbone.de/doc/refman/4.1/ja/replace.html
litton101
質問者

お礼

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

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

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

litton101
質問者

補足

yamabejpさん、いつもお世話になります > 常道なのかどうかわかりませんが、 > 「INSERT IGNORE INTO テーブル」でプライマリーキーを > いれると、すでにデータがあれば無視され、データが > なければプライマリーだけのデータができますので > そこでUPDATE テーブル WHERE プライマリーが一致 > のようにやれば、分岐は発生しません すみません、大変興味はあるのですが、具体的に想像できません。 アンケート格納テーブル(t_question)には 各支社のログインIDをプライマリキーとして収めますが、 これらのIDを、あらかじめt_questionにInsertしておけば よいということでしょうか。

noname#22222
noname#22222
回答No.3

スーツの単なるデザイナでプログラマではありませんが・・・一言。 勤怠管理データベースであれば、INSERT文は必須と思います。 単に、単一ページアンケートシステムではUPDATE文だけで事足ります。 問題は、回答をデータベース化するのかしないのか? ここに尽きると思います。

litton101
質問者

お礼

回答ありがとうございました。 回答をメールで送られてくるようなものも考えましたが、 やはりDBに集約したいです。 集計がラクなのと、どこが未回答のチェックかわかりやすく、 なにより、既存のシステムの枠を活用できるからです。 システム自体は外注で専門業者が作ったので、当然Insert文は 各所で使われているわけですが、 わたしが勉強を兼ねて一時的なアンケートを作ることになりました。 わからないことを整理してみたことを、#2さんへの御礼に書いて あります。もしよろしければご参照ください。

回答No.2

どういう構造にしたいのかもう少し詳しく知りたい所ですが、一人に対して1つの回答しか許さない構造なのですよね?質問者様の内容ですと確かに初回回答時のみInsertで問題ないと思われます。どちらにせよ初回にはInsertが必要になるのですが・・・。 >INSERT文の存在意義 新規にデータを追加する場合は必ず必要になりますが? 例えばアクセスログをDBに残したい場合など、予約システムな等であれば予約ログなど、使用用途は様々ですが重要なコマンドであることは確かです。 私もよくお世話になります(笑)

litton101
質問者

お礼

ばらばらとすみません。 アンケートに回答済みか未回答かは、 回答を収めたMySQLのテーブルにフラグを設けたり するのが一般的でしょうか。 そのあたりの王道的手段を知りたいです。 未回答者用アンケート(Insertモード).php 回答済み用アンケート(Updateモード).php と2種類用意し、 アンケートページに遷移する前に、ハイパーリンクの段階で どっちを表示させるか切り替えるべきですかね? あるいは、アンケート.php 内で、 if (回答済みフラグがたっている){   UpdateモードのHTMLを展開し、さらに   DBも読み込んで、既存の回答を表示 } elseif (まだ未回答である){   InsertモードのHTMLを展開するだけ } みたいに処理を分けるとか?

litton101
質問者

補足

ご回答ありがとうございました。 >どういう構造にしたいのかもう少し詳しく知りたい所ですが、 > 一人に対して1つの回答しか許さない構造なのですよね? まさにその通りです。 ブラウザで東京支社の社員がシステムにログインして、 メニューに入ると、 ------------- 東京支社 ------------- ●勤怠管理 9月 ●予算計画 9月 ●連絡先 -------------- みたいな雰囲気で、当該支社のメニューが表示され、ここに ●アンケート という項目を追加したいです(●は全てハイパーリンク)。 そしてアンケートページ(question.php)に遷移した際、 (1) 初めてこのアンケート画面を表示した、あるいは   表示は初めてでなくても未回答 なのであれば、前質問が空白のフォームを出し、裏で動いている PHPプログラムにはInsertモードのSQLを用意しなければならない でしょう。例えば、以下のように。 回答者性別 ○男 ○女 回答者所属 [      ] 他方、 (2) 既に回答済みだが、誤りがあったので訂正、修正、更新 したいのであれば、裏のプログラムではUpdateモードである ことを判別し、既存の回答をアンケートテーブルから読み 込んで表示してあげなければならないでしょう。例えば、 回答者性別 ◎男 ○女 回答者所属 [東京支社第一営業部]  のように。 この判断がわからないので、Insertモードなど経ず 一律にUPDATEモードで開けばいいんじゃないのかと思ったしだいです。 しかし、 > 新規にデータを追加する場合は必ず必要になりますが? ということは、駄目ですね。

  • yuchi-co
  • ベストアンサー率60% (29/48)
回答No.1

予め何件のデータが入るか判っていて、テーブルに回答数分の行がINSERTされているのであれば、UPDATE文だけでできると思いますが。 テーブルが作成されただけでは、行は存在しないので、最初の回答でINSERT→回答の変更でUPDATEが自然だと思います。

litton101
質問者

お礼

早速のレスありがとうございました。 やっぱりそうですよね。 InsertモードかUpdateモードかをどうやって 切り替えるかがよくわからないしだいです。 だったら、最初からInsert飛ばして Updateモードオンリーで運用できるのでは? と短絡的に考えました。 もう少し勉強してみます。ありがとうございました。

関連するQ&A

  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Mysqlのupdate文

    Mysql3.23.42+PHPで下記のようなテーブルで Field| Type ----+------------  a | int  b | varchar  c | varchar  d | timestamp  e | timestamp update文を実行すると、 例  update set b='あ',c='い',e=NULL where a='1'; dまでアッデートされてしまうのですが何ででしょう? 何か特別なことしなくてはいけないのでしょうか?

  • 1つのphpファイルで、入力フォーム、チェック、Insertまで全て済ませられませんか

    PHP4.4.4+MySQL4.0.26 PHPの入門書に、form.html から、update文を含むPHPにPOSTする 掲示板サンプルがあるのですが、これにある入力チェックサンプルですと、 別画面に遷移して(例えば投稿者名は)「全角10文字以下にして」、とか メッセージを表示します。そうではなく、 値を入力   ↓ 登録ボタン押下   ↓問題なしなら     ↓問題あるなら INSERT文を実行    問題ある【フォームの脇に】「10文字以下で」と表示 のように1つのPHPファイルで全てを済ませたいのですが、可能でしょうか。 下記サンプルで、update.phpのところを<?= $PHP_SELF ?>にして、 <html> <body> <form method="post" action="update.php"> 投稿者名<input type="text" name="name" value=""> <input type="submit" name="reg" value="登録"> </form> </body> </html> 投稿者名の脇に if (strlen($name) == 0) {   $errmsg .= "回答者名が入力されていません。<br>"; } print $errmsg; みたいなものを仕込めばよさそうですが、 (1) これを登録ボタン押下時だけ動作させなければだめですよね? (初めに表示するときにチェックにHITしてしまうでしょうから) それをどうしたらいいかわかりません。 (2) ↑が克服できたとしても、問題がなければSQLでINSERT or UPDATEを かけなければならないですが、POST先が$PHP_SELFだと、永久にUPDATEが かからず、入力チェックばかりが無限ループしてしまうと思うのですけど。 (3) それと、Insert ot Updateがかかったら「ありがとう」を出して、別画面に リダイレクトしたいです。 以上の極めてシンプルなもので結構ですので、サンプルをご教示いただけませんか

    • ベストアンサー
    • PHP
  • PHPで「\」をDBにインサートすると「\\」になる件

    宜しくお願いします。PHP初心者です。 今PHP(smartyも利用しています。)とMYSQLで新着情報のプログラムを作成しています。「タイトル」と、「本文」のフォームがあり、それをDBにインサートして表示させるというシンプル?なものです。 ページ遷移は、「フォーム記入ペ-ジ」→「確認ページ」→「登録完了ページ」というふうになっています。 フォーム記入ページで「\」と記入して確認ページに移動すると、「\\」となってしまします。 この原因が分かる方いらっしゃいましたらご教授いただけないでしょうか。

    • ベストアンサー
    • PHP
  • JDBCを使ってdate型へのINSERTはできますか?

    JDBCを使ってOracleへ接続し、DBへデータを挿入したいのですが、 日付型のデータがどうしてもうまく挿入できません。 jsp + Servlet + Bean で開発しています。 使っているテーブルは CREATE TABLE USERS (     USERID     VARCHAR2(10) NOT NULL,     PASSWORD  VARCHAR2(10) NOT NULL,     NAME      VARCHAR2(50) NULL,     SEX       VARCHAR2(5)  NULL,     BIRTHDAY   DATE       NULL,     PRIMARY KEY (USERID, PASSWORD) ) という風な型で、定義しています。 DBへのINSERT処理は、Beanで行っています。 以下のINSERT文を実行したのですが、うまくINSERTできませんでした。 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX, BIRTHDAY)" + "VALUES ('use', 'pass', 'ナマエ', '女性', '1980/06/05')" int numOfUpdate = statement.executeUpdate(sqlQuery); ちなみに、この中のdate型で定義している「BIRTHDAY」を除いたINSERT文 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX)" + "VALUES ('use', 'pass', 'ナマエ', '女性')" int numOfUpdate = statement.executeUpdate(sqlQuery); だとうまくINSERTできます。 sql*plusを使って直に書くと、両方うまくINSERTできました。 ●その後に、「BIRTHDAY」をdate型からVARCHAR2(10)へ定義し直し、  DBを作り直して実行した所、うまくINSERTできるようになりました。 なぜ「date型」だとINSERTできず、「VARCHAR2型」だとINSERTできるのか、 知っている方がおられましたら、ぜひ教えて頂きたいです。

    • ベストアンサー
    • Java
  • PHP/MySQL SQLエラーについて。

    PHP/MySQLについての質問です。 当方PHP/MySQLについては初心者で、現在参考書を見ながらWebアプリケーションを作成しています。 いくらやっても成功しない例があるので、どこが間違っているのか、 なぜ成功しないのかご教示願いたいです。 エラー名:SQL実行エラー 要因:不明。SQL文を変えたりしたところ成功したこともあるので(elect id,name,age from input_table 等)SQL文に間違いがあるのか? -------------------input.html------------------------ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <form action="input.php" method="post"> 名前:<input type="text" name="nm"> 年齢:<input type="text" name="age"> <input type="submit" name="exec" value="登録"> </form> </body> </html> -----------------------input.php---------------------------- <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php //DB接続 if(!$con=mysql_connect("localhost","root","********")){ //passwardは正確 echo"接続エラー"; exit; } //DB選択 if(!mysql_select_db("input",$con)){ echo"DB選択エラー"; exit; } $sql = "insert into input_table(name,age) values('$nm',$age)"; if(!$res=mysql_query($sql)){ echo"SQL実行エラー"; //ここでこのエラーが表示されてしまう exit; } echo "登録完了"; mysql_close($con); ?> </body> </html> --------------------database----------------------- create table input_table( id int not null auto_increment, name varchar(20) not null, age int not null, primary key(id) )

    • ベストアンサー
    • PHP
  • PHPとMySQL、INSERTの動作についての少し疑問点。

    PHPとMySQL、INSERTの動作についての少し疑問点。 現在、PHPとMySQLを使ってHPを作成しています。 会員登録のページが存在し、会員情報をDBに書き込む時にINSERT文を使用しているのですが この動作を複数の人が同時に行った場合、どうなるのでしょうか? DB・PHP・MySQL的にエラーが出るのであれば 『書き込み処理中は時間差で実行する』等の 何か回避策をしなければならないのですが・・・。 その辺りが少し疑問に思ったのでお伺いしたく思います。 初歩的な質問になりますがお教え頂ければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 見たことのないINSERT文

    お世話になります。 他人の書いたSQLを解析して以下のようなコードを見つけました。 CREATE TABLE OYA ( ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / CREATE TABLE KO ( ID NUMBER NOT NULL, OYA_ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / INSERT INTO ( SELECT ID ,OYA_ID ,NAME FROM KO WHERE EXISTS ( SELECT ID FROM OYA WHERE NAME LIKE '%1' ) ) VALUES ( 1 ,1 ,'KODOMO-1' ); INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。 SELECT INSERT文は知っていますが、このような表記は初めてです。 (文法エラーにならないのに驚きました) おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。 実際は、OYAがなくてもINSERTは実行されてしまいますが。。。 このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

  • MySQL insert文に関するエラーについて

    ○質問の主旨 MySQLのデータベースにテーブルを作ってinsert文で データを追加しようとするとシンタックスエラーが出ます。 SQL文が間違っているのかと思いGoogle検索や本で調べたりしましたが、 なぜ文法エラーが発生するのか分かりません。 エラーと対処方法をご存知の方がいらっしゃいましたらご教示願います。 ○質問の補足 // usersテーブル create table users ( id int not null auto_increment primary key, created datetime not null, modified datetime not null, username varchar(255), password varchar(40) ); desc users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | | username | varchar(255) | YES | | NULL | | | password | varchar(40) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ insert into users (created, modified, username, password) values (now(), now(), 'test1', 'test1'), (now(), now(), 'test2', 'test2') ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 3

    • ベストアンサー
    • MySQL
  • smalldatetime型へのInsert

    ストアド内でsmalldatetime型の項目にGetDate()関数を使用してInsertしよとしているのですが、 なぜか「STRING または BINARY データは切り詰められました。」というエラーになってしまいます。 ストアドを使用しないで直接Insert文を流すと正常に登録できます。 ちなみにInsert文はごく単純で INSERT INTO テーブル名(項目名1(varchar),項目名2(varchar),項目名3(smalldatetime)) VALUES(@変数1,@変数2,GetDate()) という感じです。 どなたか分かる方いましたら助言お願いします。