
チェックボックスで、複数の項目をフラグとして扱うにあたって
ビット演算を使いたいと思っています。
この時、チェックボックスを作成するフォームの値は
<input type="checkbox" name="category[]" value="1" />ライフ
<input type="checkbox" name="category[]" value="2" />デジタルライフ
<input type="checkbox" name="category[]" value="4" />趣味
<input type="checkbox" name="category[]" value="8" />エンターテイメント
.
.
.
と、valueの値をべき乗づつ増やしてくもしくは、あるいは
value の値を1234としてやってあとでx2するかして
それらの合計(例えばチェック状態が00101 なら 5)を
DBに保存してやるというロジックでいいのでしょうか?
他のポータルサイトのソースをみても、そんなやり方してるサイトをみかけないので
はたしてこれで合ってるのか不安になってきて質問させて頂きました。
No.1ベストアンサー
- 回答日時:
ご質問の方法でも、ロジック的には恐らく正しいと思いますし、データがコンパクトになるという利点もあると思います。
ちなみに、MySQLの場合は、「set型」というのもありますのでご参考まで。(他のDBとの互換性を考えるとあまり推奨はできませんが・・・)
ところで、危惧されている通り、WEB+DBにおいては、複数のチェックボックスの状態は、整数型1つにビット演算といった、「スマートな方法」でまとめるのではなく、もっと「シンプルかつ泥臭い方法」の方が好まれていると思います。
たとえば、上述の例の場合、
isLife : boolean,
isDisitalLife : boolean,
isHobby : boolean,
isEntertainment : boolean,
...
というふうに、boolean型の複数項目に展開して管理する(チェック項目が増えたら増やす)方が、あとあと良いケースもあります。(良くないケースもありますが)
また、フラグがもっと多かったり、構成が動的になる場合は、関連付け用などに、複数のテーブルを作って管理する方法も視野に入ってくるかもしれません・・・。
このように、WEB+DBでの開発は、CやC++などの開発と若干異なり、「少々、データが冗長になったり、効率が最高でなくても良いので、可能な限り、シンプルかつ分かりやすく作る」ことが多いように思います。
理由はいろいろありますが、一つに、「DBを出来る限り可読にした方が、phpMyAdminなどでの管理が楽になる」ということがあります。(ビット演算の場合、例えば132という数字で、どのフラグがONなのか、一般人には分かりにくいですが、isLifeが1になっていれば一目瞭然です。緊急にDBを手直しする必要がある場合も同様。)
こういった「管理」のほかにも、データが多くなった場合の「検索性能」や、今後のための「拡張性」など、いろいろな考慮点がありますので、どの方法が一番優れているということではなく、これらの諸点を、システムの仕様や利用形態に照らしながら、適材適所で選択されると良いと思います。
なお以上のご回答は、いちSEたる私個人の経験に基づく、私的見解ですので、あくまでご参考まで・・・。
回答有り難うございます。
チェックボックスが20個くらいになって
なってきたら booleanだらけになってくるので
どうなのかなとおもったのですが、
”分かりやすさ”という点を意識するなら
たしかにビット演算用の数値がはいると
ややこしいかもしれませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Oracleで上書きImportはできま...
-
Accessのテーブルデータを一気...
-
ビューのソートについて
-
「クリップボードにコピーされ...
-
テーブルで一番古いレコードだ...
-
アクセス レコードセットを更...
-
PostgreSQLのパフォーマンスに...
-
left joinなどで結合対象のレコ...
-
htmlコードで書かれた表にphpで...
-
改行のあるデータをWebで表示す...
-
処理の途中で停止させ、再開さ...
-
CONNECT BYに関して
-
sql serverのテーブルレイアウ...
-
このISAMでは、リンクテーブル・・
-
ORA-01401が表示され、データが...
-
動画をsqlで上手くinsertできま...
-
同一テーブルのデータを参照し...
-
マテリアライズドビューとスナ...
-
ERROR1062:Duplicate entry.......
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
ビューのソートについて
-
テーブルで一番古いレコードだ...
-
Oracleで上書きImportはできま...
-
アクセス レコードセットを更...
-
このISAMでは、リンクテーブル・・
-
住所のDBテーブル、マスターの...
-
結合テーブルでINSERTする方法...
-
同一テーブルのデータを参照し...
-
マテリアライズドビューとスナ...
-
htmlコードで書かれた表にphpで...
-
accessでレコード更新直後の反...
-
IF NOT EXISTを使用するINSERT文
-
Access VBAからエクセルに出力...
-
ORA-01401が表示され、データが...
-
構文エラー : 演算子がありませ...
-
ERROR1062:Duplicate entry.......
-
ODBC接続で新しいレコードを追...
-
「クリップボードにコピーされ...
おすすめ情報