プロが教えるわが家の防犯対策術!

お世話になります。

配列でデータを受け取って、下の様な構文を書けばPDOを使用してupdateできますが、
データの削除を行って、idが欠番になった場合の対策として、どの様に書けば良いのかが
分かりません。

-------------------------------------------------

$id = $_POST['id'];
$test = $_POST['test'];

$sql = "UPDATE test_table SET test = ? WHERE id = ?";
$stmt = $conn->prepare($sql);

foreach ($test as $id => $value) {

$stmt->execute(array($value, ++$id));

}

-------------------------------------------------

もし削除処理が行われたら、欠番の穴埋めを行い、尚且つidは
オートインクリメントしているので、最終のidを取得してALTER TABLEで
新規データを追加した際にも欠番が出ないようにしようかとも考えましたが、
効率的とは思えなかったので、もしidに欠番があっても該当する「 id 」に
正常にデータをupdateできる構文をご教示いただきく存じます。


----------------
▼スペック

PHP 5.3.3
MySQL 5.0.95
----------------

A 回答 (2件)

>もしidに欠番があっても該当する「 id 」に


>正常にデータをupdateできる構文

考え方は2つ

(1)そもそも存在しないIDをupdateするのだから存在しない時点でupdateはされないので問題ない

たとえばidが1,2,4しかない時点で
update ~ where id=3
としても条件節にヒットするデータがないので0件更新されておしまい

(2)存在しないIDをupdateするときには新規に追加する
これはINSERT ... ON DUPLICATE KEY UPDATE構文を使えばよい

同じ例でいえばidが1,2,4しかないとき
ID=1はアップデータするけど,ID=3のときにはINSERTする

いずれにしてもIDはデータを特定するためのものですから
IDを振り直すという行為はしていけない
さらに言えば、データ削除するのではなくdelete_flag的なカラムで
コントロールすればIDに抜け番は発生しない
(ただし抜け番が発生してもなんの問題もないし、むしろ削除フラグのついた
IDに対してアップデートをしていいかどうかのルール決めが必要になるが)
    • good
    • 0
この回答へのお礼

ご回答をいただき、ありがとうございます。

一応結論として、「 削除 」のアクションがあった場合にdelete文を
発行せずに、update文で該当のid( クリックされたid )のtestカラムの値を
空にしました。

データをselectする際に、
「 もしtestカラムのデータが空であれば、該当のidレコードは表示させない 」という
条件分岐をさせました。但し、その後のupdate文の発行でidがズレてしまうので、
hiddenで空のデータとidは埋め込んでおきます。

つまり、1,2,3,4,5,・・・,n、という絶対に欠番が出ないようにしました。

何だかスッキリしない感じですが、一応目的の形ににはなりましたのでご報告いたします。
参考になるご回答をいただき、大変感謝申し上げます。

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

お礼日時:2014/03/14 12:58

>$id = $_POST['id'];



そもそも欠番のIDがPOSTされるというのが「あり得ない」ハズです。当該レコードを選択したらphpスクリプト側で自動的にセットするものであって、ユーザに入力してもらうものではありませんから。

もし「当該IDのデータの更新内容を入力している間に、他の端末から削除されてしまった」というケースを想定するならば、updateした更新件数が 0 だったら【更新できませんでした】とか【当該IDのデータがありません】などと表示して止まるしかありません。削除されたものはどうやってもupdate出来ません。
    • good
    • 0
この回答へのお礼

ご回答をいただき、ありがとうございます。

一応結論として、「 削除 」のアクションがあった場合にdelete文を
発行せずに、update文で該当のid( クリックされたid )のtestカラムの値を
空にしました。

データをselectする際に、
「 もしtestカラムのデータが空であれば、該当のidレコードは表示させない 」という
条件分岐をさせました。但し、その後のupdate文の発行でidがズレてしまうので、
hiddenで空のデータとidは埋め込んでおきます。

つまり、1,2,3,4,5,・・・,n、という絶対に欠番が出ないようにしました。

何だかスッキリしない感じですが、一応目的の形ににはなりましたのでご報告いたします。
参考になるご回答をいただき、大変感謝申し上げます。

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

お礼日時:2014/03/14 12:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!