
お世話になります。
配列でデータを受け取って、下の様な構文を書けば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
----------------
No.1ベストアンサー
- 回答日時:
>$id = $_POST['id'];
そもそも欠番のIDがPOSTされるというのが「あり得ない」ハズです。当該レコードを選択したらphpスクリプト側で自動的にセットするものであって、ユーザに入力してもらうものではありませんから。
もし「当該IDのデータの更新内容を入力している間に、他の端末から削除されてしまった」というケースを想定するならば、updateした更新件数が 0 だったら【更新できませんでした】とか【当該IDのデータがありません】などと表示して止まるしかありません。削除されたものはどうやってもupdate出来ません。
ご回答をいただき、ありがとうございます。
一応結論として、「 削除 」のアクションがあった場合にdelete文を
発行せずに、update文で該当のid( クリックされたid )のtestカラムの値を
空にしました。
データをselectする際に、
「 もしtestカラムのデータが空であれば、該当のidレコードは表示させない 」という
条件分岐をさせました。但し、その後のupdate文の発行でidがズレてしまうので、
hiddenで空のデータとidは埋め込んでおきます。
つまり、1,2,3,4,5,・・・,n、という絶対に欠番が出ないようにしました。
何だかスッキリしない感じですが、一応目的の形ににはなりましたのでご報告いたします。
参考になるご回答をいただき、大変感謝申し上げます。
ありがとうございました。
No.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に対してアップデートをしていいかどうかのルール決めが必要になるが)
ご回答をいただき、ありがとうございます。
一応結論として、「 削除 」のアクションがあった場合にdelete文を
発行せずに、update文で該当のid( クリックされたid )のtestカラムの値を
空にしました。
データをselectする際に、
「 もしtestカラムのデータが空であれば、該当のidレコードは表示させない 」という
条件分岐をさせました。但し、その後のupdate文の発行でidがズレてしまうので、
hiddenで空のデータとidは埋め込んでおきます。
つまり、1,2,3,4,5,・・・,n、という絶対に欠番が出ないようにしました。
何だかスッキリしない感じですが、一応目的の形ににはなりましたのでご報告いたします。
参考になるご回答をいただき、大変感謝申し上げます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
【C#】DataGridViewの最大列数...
-
ActiveReportのサブレポート機...
-
INIファイルに一括書き込みを行...
-
「外部データの取り込み」とい...
-
VisualBasic2010のPictureBoxに...
-
Excel VBA:特定の文字列以降(...
-
findstrのerrorlevel
-
shシェルスクリプト 空白行の...
-
「取得先」という表現について
-
classの再定義エラーについて
-
EXCEL、マクロ-改ページ行番号...
-
XMLのタグの有無をPHPで判定し...
-
Smarty変数の値をJavascript変...
-
VB.NETでボリュームを取得・設...
-
ps3で久しぶりにCDの音楽情報取...
-
ExcelVBAで、FileSystemObject...
-
複数ページでセッションを使わ...
-
Google scholarがひらけなくな...
-
開始と終了を指定して、その間...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
excel access連携 このテーブル...
-
【C#】DataGridViewの最大列数...
-
WordでExcelデータを差込...
-
DTOとEntityの差は何ですか。
-
MSFlexGridのデータを初期化し...
-
Strutsで画面に表示した値の再...
-
長い1枚ページを無限スクロール...
-
「外部データの取り込み」とい...
-
表を表示するコントロールについて
-
INIファイルに一括書き込みを行...
-
C言語で地図を描きたい
-
OleDbDataReaderで単精度浮動小...
-
GridViewからチェックボックス...
-
ASP.NET GridView の検索画面で...
-
VB webbrowserを使ってサイトの...
-
Excelデータの表示方法について
-
VBA内でのGetPixelを使用した時...
-
ActiveReportのサブレポート機...
-
アクセス+VBA 最適化
おすすめ情報