人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでDB更新処理を作っています。
同じ条件がDBに登録済みであれば上書き、条件に合致する情報がない場合は新規登録とする処理です。
ここでは、条件をIDとNOとしています。
////////////////////////////////////////
$db = DB::connect(mysql://$user:$pass@$host/$db);
$st = $db->prepare("SELECT COUNT(*) FROM table WHERE id=? AND no=?");
$rs = $db->execute($st, array($id, $no));
$cnt = 0;
while ($row = $rs->fetchRow()) { $cnt++; }
if ($cnt) {
// 同じ条件が登録済み
$st = $db->prepare("UPDATE table SET dt1=?, dt2=?, ... WHERE id=? AND no=?");
$db->execute($st, array($new1, $new2, ... $id, $no));
} else {
// 同じ条件は未登録
$st = $db->prepare("INSERT INTO table (dt1, dt2, ...) VALUE (?, ?, ...) WHERE id=? AND no=?");
$db->execute($st, array($new1, $new2, ... $id, $no));
}
////////////////////////////////////////
一応、これはこれで正常動作するのですが、もっとシンプルに作ることはできないでしょうか?
次の?と?のシンプル化についてご教示願います。
?同じ条件がDBに登録済みかどうかの確認
?新規書き込みと更新処理
よろしくお願いいたします。

●質問者: cochoo
●カテゴリ:ウェブ制作
✍キーワード:CNT CONNECT dB MySQL PHP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● HALSPECIAL
●23ポイント

こちらはいかがでしょう。

12.2.4.3. INSERT ... ON DUPLICATE KEY UPDATE 構文

◎質問者からの返答

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

なるほど、勉強不足でした。

ちゃんと期待する動作を簡潔に書くことができました。

ありがとうございます!!


2 ● きゃづみぃ
●27ポイント ベストアンサー

DBがOracleでしたらMERGE文が使えます。

http://www.shift-the-oracle.com/sql/merge.html

質問にあるような更新処理が一回でできます。

MySQLでしたら ON DUPLICATE KEY UPDATEで 似たようなことができると思います。

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html

◎質問者からの返答

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

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。

なお、今回のDBはMySQLですが、Oracleも使っていますので、ぜひ活用させていただきます。

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


3 ● chuken_kenkou
●23ポイント

// 同じ条件は未登録

$st = $db->prepare("INSERT INTO table (dt1, dt2, ...) VALUE (?, ?, ...) WHERE id=? AND no=?");

$db->execute($st, array($new1, $new2, ... $id, $no));

}

////////////////////////////////////////

一応、これはこれで正常動作するのです

INSERTのVALUESの指定の後に、WHERE句の指定があるのは、コピペミスですよね?

MySQLの独自機能ですが、INSERT文でON DUPLICATE KEY UPDATEという独自構文があります。

これは、重複キー値が存在すればUPDATE、存在しなければINSERTするという動作をします。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE 構文

◎質問者からの返答

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

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。ありがとうございました!

INSERTはコピペミスです。すいません。


4 ● standard_one
●23ポイント

「同じ条件」というのがユニークキーであればon duplicate key updateを使えばいいと思います。

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html

◎質問者からの返答

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

みなさん、同じご指摘でこれが確実な方法と思います。

ちゃんと期待する動作を簡潔に書くことができました。ありがとうございました!

本当にありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ