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

MySQL5.5の検索に関する質問です。
テーブルは以下の構造とし、PDOを使用しています。
PHPは7.0。

テーブル名:users
aId int auto_increment primary key,
bId int,
created datetime,
modified datetime

bIdを検索し、存在したらレコードのmodified更新、無かったらbId, created,をセット後レコード追加。
直後に、更新もしくはインサートされたレコードのaId含む全フィールドを取得したい・・・。
とした場合、更新やインサートと同時にレコードを取得する方法はありますか?
それとも、bIdでもう一度検索かけないとだめですか?

よろしくお願いします。


●質問者: wsapp
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● muranet
●100ポイント

(1)bIdを検索し、存在したらレコードのmodified更新
bIdで検索するときに select bId from users ? ではなく select * from users ?で取ってきたら、該当レコードの情報はどこかに保存しておけそう。

(2)無かったらbId, created,をセット後レコード追加
新規に追加するレコードのaId 以外の情報はプログラムで指定するのですよね? aId は 最後に挿入された行のID を取得する命令
http://php.net/manual/ja/pdo.lastinsertid.php
で取れそうです。


wsappさんのコメント
ご回答ありがとうございます。 言葉足らずでした。 上記の方法は考えたのですが、プログラムで作成したデータが、なんかの事情でDBに反映されない可能性があるのかな?と不安になり、また、更新後のレコード取得するだけで3回もDBにアクセスするのは普通か?・・・と、PDOの命令で挿入や更新と同時に呼んでくる方法がないものかと質問しました。 私は素人なのですが上記例の場合、現場ではどのような方法を取られるのでしょうか? お答えいただいた方法か?それとも、DBに3回アクセスする方法でしょうか? お答えいただいた方法は、try catch 内に記述すれば万に一つのイレギュラーも発生しませんか? よろしくお願いします。

muranetさんのコメント
はい、こちらの状況でしたら、DBに追加または更新をする前の段階でPHP側で該当レコードの情報は持っているはずなので、その情報を使います(新規に追加したレコードのIDは上記ページの命令で取れるはず)。 >try catch 内に記述すれば万に一つのイレギュラーも発生しませんか? 基本的には前後にtry catch を置いて適切にエラーハンドリングをするようにすれば、何らかのエラーが発生した場合はハンドリングされるはずです。少なくても私の経験上では、try catchを入れているのにDB更新が空振りし、ハンドリングもできなかった、というケースは見たことがないです。1秒に数万レコード更新する、とかのようなシビアな状況は経験したことがないので分かりませんが、基本的にはPHPとMySQLに用意されているエラーハンドリングの仕組みをじゅうぶん信用してよいでしょう。 想定どおり動かないのであれば、自分が書いたプログラムが間違っている可能性のほうが高いです。不安であれば、追加・更新用のSQL文をログに残すとかするとよいかもしれません。

wsappさんのコメント
ご親切にありがとうございます。 >不安であれば、追加・更新用のSQL文をログに残すとかするとよいかもしれません。 早速、教えていただいた方法で書いてまいります。 ありがとうございましたm(_ _)m
関連質問

●質問をもっと探す●



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