ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

初心者の為のSQLコミュのCGIでチェックボックスを利用する際のプログラム側のロジック

  • mixiチェック
  • このエントリーをはてなブックマークに追加
 どうぞよろしくお願いします。
 データベースはMySQL5.1、
PerlでCGIを書いています。

 CGIでチェックボックスを用意しており、
チェックされた項目をデータベースに登録するような処理を書いているのですが、
データを更新するときの処理で悩んでいます。

 例えばチェックボックスに使う項目を次のテーブルに格納しておきます:

create table items (
id int unsigned auto_increment,
name varchar(30) not null,
primary key (id)
);

チェックされた項目を次のテーブルに格納します:

create table checked_items (
checked_item_id int unsigned,
primary key (checked_item_id)
);

 このとき、
初めに checked_itemsテーブルにデータを登録します。
問題は、 checked_itemsテーブルを更新するときの処理です。

 例として、

itemsテーブル:
1, ギター
2, ベース
3, キーボード
4, ドラム

checked_itemsテーブル:
1
3

という内容で考えます。

 CGIでは、 itemsテーブルの内容をチェックボックスで表示し、
checked_itemsテーブルに含まれているものはオンにしておきます。
つまり、この場合は「ギター」と「キーボード」がオンになっています。
 ここで、ユーザは任意にチェックボックスのオン/オフを切り替えて、
「更新ボタン」を押すことで、 check_itemsテーブルの内容を変更できます。
例えば「ギター」をオフにして「ドラム」をオンにして更新すると、

checked_itemsテーブル:
3
4

のように変更できるということです。

 悩んでいるのは、こうした更新を行うときのロジックです。
作業としては

・ チェックボックスがオン、かつ、
checked_items テーブルに含まれている項目はそのまま
・ チェックボックスがオン、かつ、
checked_itemsテーブルに含まれていない項目は、
   checked_itemsテーブルへ追加
・ チェックボックスがオフ、かつ、
checked_itemsテーブルに含まれている項目は、
checked_itemsテーブルから削除
・ チェックボックスがオフ、かつ、
checked_itemsテーブルに含まれていない項目はそのまま

というようなことをすればいいと思います。
 これを実装するのに、何か効率的な方法はないでしょうか。
2重ループを使って検査すれば実装はできるはずですが、
他に良いロジックがあれば使いたいなあと・・・。

 あるいはテーブルの作り方を変えれば
すっきりと処理できるのでしょうか。

 あまりSQLに関係ないかもしれなくて恐縮ですが、
よろしくお願いします。

コメント(2)

>ケンさん

こんにちは。単純に

1.一旦checked_itemsテーブルのレコードを全削除

2.その後、チェックボックスがオンの項目を登録

という方法はどうでしょう?
>無限の住人さん

 お答え有り難うございます。
 そうですね、一度削除してから挿入するのが
最もシンプルなやり方ですね。
項目数もそんなに多くないので
この方法でやります。
 MySQLは高速なのでたぶん問題ないでしょうし。

 有り難うございました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

初心者の為のSQL 更新情報

初心者の為のSQLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング