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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

3101閲覧

PHP 1つのページで登録も更新もするには

earnest_gay

総合スコア615

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/07/10 22:35

編集2016/07/11 01:17

下記のような経歴登録フォームがあったとします。
「業務経歴を追加する」を押すと同じフォームが生成されます。

イメージ説明

このページでは、入力するだけのページを想定して作っていたのですが、
登録するボタンを押すとそのままDBへ格納するSQL文が走ります。

しかし、
登録(INSERT)も更新(UPDATE)もこの1つのページでしてくれと言われているのですが
どうすればそれができるでしょうか?

更新ということは、DBから情報を取り出して、
このフォームのvalueにその情報を渡して再現できると思うのですが、

もともと、入力するだけのページを想定して作っていたので、
登録するを押すと、以前入力した情報と同じ内容が登録されてしまいます。(更新ではない)

1つのページで登録も更新もするにはどうしたらよろしいのでしょうか?
個人的には登録ページと更新ページは分けた方がいいのかなとは思うんですが...

マイナビ転職サイトの更新ページを参考にしているんですが
例えば、自己PRには私が以前入力したものが表示されています。

この自己PRをちょっと変更して「変更内容を保存する」を押すと多分ですが、
UPDATEのSQLが走ってると思います。

でも、志望動機に関してはまだ何も入力したことがないので、
何か入力して「変更内容を保存する」を押すと多分ですが、
INSERTのSQLが走ってると思います。

そこがどういうロジックになってるのかが分からないのです...

パッと思いついたのが
単純にDBの内容を取得してemptyとかで判定して
なければINSERT
あればUPDATE

なんですが、こういう風にしているだけなのでしょうか?

イメージ説明

宜しくお願いします。


追記

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

ON DUPLICATE KEY UPDATEを使ってテストしているのですが、
これを実行すると上から2行目がテスト1に変わることは分かりました。

$sql = "INSERT INTO user_vitae( user_id, projectTitle, projectsContents ) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE user_id = ?, projectTitle = ?, projectsContents = ? "; for($i=0;$i<count($_POST['projectTitle']);$i++) { $stmt = $this->pdo->prepare($sql); $stmt->execute([ $_SESSION['id'], $_POST['projectTitle'][$i], $_POST['projectsContents'][$i], $_SESSION['id'], $_POST['projectTitle'][$i], $_POST['projectsContents'][$i] ]);

イメージ説明

しかし、案件名をUNIQUEにしているので、例えば
「test1」登録しておいて、
案件名を「test2」に変えたいなぁ~ってなったら、
更新ではなく新規登録になってしまいます。

これはどう防げばよいのでしょうか?

入力を必要としないカラムはこうなってます...

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

【取得時】

SELECTで取得を試みて,データがあればそれを,無ければ空欄を表示するだけです.

【挿入時または更新時】

REPLACEあるいはINSERT ... ON DUPLICATE KEY UPDATE構文が使えます.

投稿2016/07/11 00:04

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2016/07/11 00:30

他の方の回答のように,取得してきたときの結果を元にINSERTとUPDATEを分岐するのもナシではないですが,取得のためのコードと挿入/更新のためのコードが密結合になってしまってスパゲティコードの要因になるので,完全に分離するためにREPLACEなどを利用することをおすすめします.なお,REPLACEとINSERT...ON DUPLICATE KEY UPDATEの違いは,カラムがデフォルト値を持っているときに発生しますので,どちらを使うべきかよく検討してください.
earnest_gay

2016/07/11 01:08

そんな方法もあるのですね! ありがとうございます!
guest

0

こちらの質問が参考になると思います。
https://teratail.com/questions/40485

投稿2016/07/11 00:55

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/07/11 01:21

ありがとうございます。 拝見させていただきます。
guest

0

更新のときは、そのデータが、DBのどのレコードか示すキーを
セッションに持つなり、フォームに埋め込むなりして、フォームがPOSTされたときに
それを受け取って更新するんですから、それがないときはINSERTするだけですよね。

更新の仕組み作れば分かりますよね。

投稿2016/07/11 00:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/07/11 01:19

ログイン時にidをセッションに保存しております。 ありがとうございます。
guest

0

先に主キーでupdateして処理件数がゼロなら、insertという手があります。
その場合、select文を実行しなくて済みます。

http://www.sacnoha.com/?p=1531

私なら、updateからinsertの部分をストアドにします。

upsertのsql文を使うのも良いのですが、他のDBによって結構書き方が違いますし、sql文自体の可読性が悪いです。

投稿2016/07/11 01:03

dthani

総合スコア131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/07/11 01:23

ありがとうございます。 参考になります。
guest

0

UPDATEするには主キーが必要になってくると思うので、主キーがあればUPDATE
なければINSERTみたいな感じでifで条件分岐するのが見やすいかもしれません。

投稿2016/07/11 00:10

Yasha_Wedyue

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/07/11 01:08

参考になります! ありがとうございます!
Yasha_Wedyue

2016/07/11 01:47

ユニークキーと主キー(プライマリキー)は違いますよ。 変更するために参照するのはidなどのAIがついた数字のキーにしたほうが何かと便利です。 (forやwhileで回せるので)
earnest_gay

2016/07/11 02:24

YuyaKoshimizuさんがおっしゃっています方法は、 ON DUPLICATE KEY UPDATEではなく 普通のifということですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問