こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP・MYSQLで複数のチェックボックスを使う場合

いつもお世話になっております。

チェックボックスの値を
<input type="checkbox" value="ok" name="check[]">
として配列で渡し、ここで選択された値をforeachで回してvalueがokの場合は対応するカラムにokを挿入しています。
このやり方では、例えばチェックボックスでチェックさせたい項目が100個あった場合はチェック結果を格納するテーブルに
ck1 ck2 ck3 ck4 ck5 ck6......ck99 ck100
のように100個カラムを作る必要があります。
100個作るのが面倒・・・というわけでは無く、このやり方で良いのだろうかと疑問に感じてきました。

大量のチェックボックスを処理する場合、他に良いテーブル構造や方法などありましたら教えていただけるとうれしいです。

投稿日時 - 2009-02-03 19:15:26

QNo.4686483

困ってます

質問者が選んだベストアンサー

>foreachで回してvalueがokの場合は対応するカラムにokを挿入

という運用方法であれば

><input type="checkbox" value="ok" name="check[]">

では実現できません。

たとえば
<input type="checkbox" value="1" name="check[]">
<input type="checkbox" value="2" name="check[]">
<input type="checkbox" value="3" name="check[]">
などのようにvalue値で判断するか、
<input type="checkbox" value="1" name="check[1]">
<input type="checkbox" value="1" name="check[2]">
<input type="checkbox" value="1" name="check[3]">
のようにvalueは適当にいれておいてnameでユニークにするのが
妥当でしょう。いずれのやり方でも

>ck1 ck2 ck3 ck4 ck5 ck6......ck99 ck100
>のように100個カラムを作る必要があります。

とする必要はなく、「チェックされたものを入れておくカラム」が
1個あれば、あとは1番と3番と7番がチェックされました・・・
のように1チェックにつき1レコードをもてばカラムを
増やす必要はありません。

投稿日時 - 2009-02-03 20:12:50

お礼

お返事ありがとうございます。
色々勘違いしており申し訳無いです。

>とする必要はなく、「チェックされたものを入れておくカラム」が
>1個あれば、あとは1番と3番と7番がチェックされました・・・
>のように1チェックにつき1レコードをもてばカラムを
>増やす必要はありません。

仰る方法ですとチェックする項目が増えた場合でもDBを意識せず、フォーム表示部分で追加するだけでチェック出来ますね。
いつも色々教えて頂き、ありがとうございます。

そこで、図々しくももう少し質問させて頂きたいのですが、
上記の方法でchecktableとは別にusertableがあるとして、ユーザIDを用いて結合し、検索等を行えるとこまではわかるのですが、
この方法でチェックボックスがユーザによって更新される場合、更新時にchecktableにユーザIDを用いてDELETEコマンドを発行した後、テーブル上から該当ユーザのチェック情報を削除→入力されたチェック情報をINSERT、という形で良いでしょうか?

投稿日時 - 2009-02-03 22:47:18

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

zwi

思いつく手は、#1さんの言うように。
チェックテーブルを作って
・元のレコードのキー
・チェック番号
と言うようなレコードを持つとか。
他の案としては、チェックフラグを1個の文字列カラムにして、
0000101010101010100....(100個分の文字列)
0なら無効1なら有効として処理する事で文字列で持つ事も出来ます。

投稿日時 - 2009-02-03 20:33:47

お礼

お返事ありがとうございます。

>0000101010101010100....(100個分の文字列)
>0なら無効1なら有効として処理する事で文字列で持つ事も出来ます。

このようなやり方もあるのですね。
項目の量や拡張性、検索の利便性などを考えるとチェック専用テーブルにレコードを足して行く方法がやりやすそうですが、場合によっては0と1を用いる方法が都合が良い場面もありそうです。
今後の参考にさせていただきます。
ありがとうございます。

投稿日時 - 2009-02-03 23:04:49

あなたにオススメの質問