• 締切済み

MySQLのBIT型列へのデータ格納について

現在、ユーザー登録処理の設計を行っております。 ユーザー登録情報に、「趣味」という項目があるのですが、 20個の種類が有ります。 私が想定しているのは、ユーザーテーブルに 20byte程の「趣味」列を作り、 ブラウザ側でチェックをした種類の値を見て、 その値のbyte目に"1"が立ち、それ以外は "0"が立つという処理です。 (例) <input type="checkbox" name="hobby" value="1"> <input type="checkbox" name="hobby" value="2"> <input type="checkbox" name="hobby" value="3"> ・ ・ ・ <input type="checkbox" name="hobby" value="20"> ↓(1番目、3番目、20番目にチェックが入った場合) 10100000000000000001 が、「趣味」列に入る この作りをした際、値を格納するテーブルの列には、 「byteではなく、bitを使用した方がよい」という有り難いアドバイスを 頂いたのですが、実際にMySQLにBIT列を設けて、どのようにPHPから データを格納すればよいか分かりませんでした(涙)。 どなたか、お教えいただけませんでしょうか。お願い致します。

  • PHP
  • 回答数1
  • ありがとう数3

みんなの回答

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

こんにちは。 前回のやりとりは静観していました。 おそらく「ビットで持つ」と発言した方はC言語的な意味合いで言ったのだと思います。 趣味というひとつのカラム(これは例えばINT型にします)を設け、そのINT型のひとつの値に対してビットを立てて管理しようということだと推測されます。 つまり質問者さまの例で言えば、10100000000000000001 は16進数で表現すると A0001 となり更に10進数で表現すれば 655361 という数字になります。 これを趣味カラムにセットすればひとつのカラムで管理できるということになります。 たぶん前回の回答者さまはこういうことを言いたかったのではと推測できます。 しかし僕はあまりお勧めしません。 理由としては一目ではどこのビットが立っているかわからないからです。 ですので同じような考え方で趣味はCHAR型のカラムにし、文字列として 10100000000000000001 を持つ方がよいと思います。 こちらを推奨する理由にはもうひとつあって、扱えるビット数(厳密にはビットではないですが)が格段に多いということです。 INT型で持ってしまうと32ビット、つまり32個の趣味までしか管理できません。 その点CHAR型やTEXT型にすれば相当な数が扱えます。 ま、その分領域も食いますが気にするほどではないでしょう。 というわけで全然BIT型の回答ではないですが、参考までに。

bacho39
質問者

お礼

ご回答、ありがとうございます! 私はまだまだ初心者プログラマですが、 その私であっても、明快な内容でした。 ご説明いただいただけでなく、 アドバイスもしていただき、感謝しております。 どうもありがとうございました。 とても参考になりました。

関連するQ&A

  • 大量チェックボックスの実装方法について

    現在、ユーザー登録処理の設計を行っております。 ユーザー登録情報に、「趣味」という項目があるのですが、 20個の種類が有ります。 処理速度の速さと、今後、趣味の種類数が増えた時の ことを重視すると、どのような実装方法が一番効率が よいのでしょうか? 私が想定しているのは、ユーザーテーブルに 20byte程の「趣味」列を作り、 ブラウザ側でチェックをした種類の値を見て、 その値のbyte目に"1"が立ち、それ以外は "0"が立つという処理です。 (例) <input type="checkbox" name="hobby" value="1"> <input type="checkbox" name="hobby" value="2"> <input type="checkbox" name="hobby" value="3"> ・ ・ ・ <input type="checkbox" name="hobby" value="20"> ↓(1番目、3番目、20番目にチェックが入った場合) 10100000000000000001 が、「趣味」列に入る 他にも、趣味テーブルを用意するなどを考えたのですが、 そうすると趣味マスターテーブルも必用になることと、 10000人以上のユーザーが存在する場合の処理速度を 考えると、ちょっと微妙な気がします・・・(汗) 何かよい案がおありでしたら、ご教授ください! お願い致します。。。

    • ベストアンサー
    • PHP
  • フォーム INPUTの文字化け対策の対処方は?

    チェックボックス(趣味のリスト)のチェック有無を配列で受けていますが、"パソコン"の文字が"パソ\コン"に文字化けしてしまいます。対処方法をお教えください。 <?php mb_language('Japanese'); $hobby=@implode(" ",$_POST[hobby]); echo $hobby; ?> <FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" > <INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR> <INPUT type="checkbox" name="hobby[]" value="温泉" >温泉<BR> <INPUT type="checkbox" name="hobby[]" value="ゴルフ" >ゴルフ<BR> <INPUT type="checkbox" name="hobby[]" value="パソコン" >パソコン<BR> <INPUT type="checkbox" name="hobby[]" value="ドライブ" >ドライブ<BR> <INPUT type="checkbox" name="hobby[]" value="写真" >写真<BR> <INPUT type="submit" name="submit" value="送信"><BR> <INPUT type="reset" name="reset" value="RESET"> </FORM>

    • ベストアンサー
    • PHP
  • 【mysql : HTML】チェックボックスの処理

    チェックボックスで、複数の項目をフラグとして扱うにあたって ビット演算を使いたいと思っています。 この時、チェックボックスを作成するフォームの値は <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に保存してやるというロジックでいいのでしょうか? 他のポータルサイトのソースをみても、そんなやり方してるサイトをみかけないので はたしてこれで合ってるのか不安になってきて質問させて頂きました。

    • ベストアンサー
    • MySQL
  • フォームのPOSTデータをサブウィンドウに渡したいです。

    フォームのPOSTデータをサブウィンドウに渡したいです。 <form action="sample.html" method="post"> <input type="checkbox" name="test[]" value="0">0 <input type="checkbox" name="test[]" value="1">1 <input type="checkbox" name="test[]" value="2">2 <input type="checkbox" name="test[]" value="3">3 <input type="checkbox" name="test[]" value="4">4 </form> 上記のフォームの値を、サブミットボタンを押したときにサブウィンドウをひらき、そのサブウィンドウに渡したいのですが、いまいち上手くいきません。 window.openでサブウィンドウを開いてもデータが受け渡せずにいます。 このような場合、どうしたら値を渡せるのでしょうか。 理想はPOSTで渡したいのですが、引数で渡す方法でもかまいません。

  • チェックボックスのON/OFFに応じて別の複数のチェックボックスも連動ON/OFF

    7番のcheckboxをON→1,2,4,5番にチェックもON 7番のcheckboxをOFF→1,2,4,5番にチェックもOFF という風に動作させる記述をご教示ください。 よろしくお願い致します。 <html> <head> <script type="text/javascript"> </script> </head> <body> <form action="" method="post" name="myform"> 去年<br> 1番<input type="checkbox" name="kyonen[]" value="1">1月<br> 2番<input type="checkbox" name="kyonen[]" value="2">2月<br> 3番<input type="checkbox" name="kyonen[]" value="3">3月<br> 今年<br> 4番<input type="checkbox" name="kotosi[]" value="1">1月<br> 5番<input type="checkbox" name="kotosi[]" value="2">2月<br> 6番<input type="checkbox" name="kotosi[]" value="3">3月<br> 7番<input type="checkbox" name="mychk">去年と今年の1、2月をまとめてチェック<br> </form> </body> </html>

  • 連想配列の処理

    こんにちは。 MySQL 4.1.22 と PHP 4.4.7 でプログラムを組んでいて、こちらではいつも皆様の知識と経験を参考にさせていただいております。 今回、どうしても超えられない壁に当たってしまいコーディングが止まってしまったので力をお貸し下さい。 今取り組んでいるプログラムは、複数の<checkbox>から選択した値を受け取って、マスターテーブルに検索を掛けて、返った値を表示した後、確認ボタンで別のユーザーテーブルに値を格納するというものです。 *** プログラムの流れ **** input.php(入力ページ:checkbox )  ↓ view.php (確認ページ:CC_master.tbl)  ↓ regist.php (登録ページ:user_master.tbl) input.php から値を取得して、 CC_master.tbl に検索・値の取得までは出来たのですが、取得した値を別の形に整形するところでつまづいてしまいました。 //--- input.php --- //--- 実際には 99個の checkbox がある訳ではありません。^^; <form name="form" method="POST" action="view.php"> <input type="checkbox" name="cc[]" value="1">50cc <input type="checkbox" name="cc[]" value="2">80cc <input type="checkbox" name="cc[]" value="3">125cc <input type="checkbox" name="cc[]" value="4">200cc <input type="checkbox" name="cc[]" value="5">250cc <input type="checkbox" name="cc[]" value="6">400cc   ・   ・(中略)   ・ <input type="checkbox" name="cc[]" value="99">その他 <input type="submit" name="exec" value="排気量の確認"> </form> //--- END Code --- //--- view.php --- //--- チェックされた排気量コードを CC_master.tbl に対して検索をかける //---例:1番、2番、6番にチェックを入れたとして... //---具体的な排気量を「 50cc 80cc 400cc 」の様に一列、スペース区切りで変数($cc_name)に格納、表示 $arr_cc = $_POST["cc"]; if(isset($arr_cc) and count($arr_cc) > 0){ $val = ""; for($i=0; $i<count($arr_cc); $i++ ){ if($i == 0){ $val .= $arr_cc[$i]; }else{ $val .= "," . $arr_cc[$i]; } } } $res = mysql_query("select * from CC_master where id in ('$val')"); while($row = mysql_fetch_array($res)){ # #ここで配列からフィールド:cc の値のみを取り出して、変数 $cc_name に格納。 # } ecoh $cc_name; //--- END Code --- //--- regist.php --- //--- $cc_name の値をINSERT文で user_master.tbl に登録。 現在、上記のように考えていますが、どうしても変数 $cc_name に意図した形で値を格納できません。 $val に値を入れる要領で処理すればOKだと思うのですが、while( )、for( )、foreach( ) のどれを使っても上手くいきません。連想配列となる $row["cc"] の扱い方(整形方法)がどうしても解らないで助けて下さい。 宜しくお願いします。 //--- CC_master.tbl --- CREATE TABLE `CC_master` ( `id` int(2) NOT NULL default '0', `cc` varchar(10) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=ujis; INSERT INTO `CC_master` (`id`, `cc`) VALUES (1, '50cc'), (2, '80cc'), (3, '125cc'), (4, '200cc'), (5, '250cc'), (6, '400cc'),   ・   ・(中略)   ・ (99, 'その他');

    • 締切済み
    • PHP
  • チェックボックスをクリックした際、自動的に他の値も

    ■チェックボックスをクリックした際、自動的に他の値も追加したい 下記のようなチェックボックスがあった際に、 <input type="checkbox" name="hoge[]" value="1" />ホゲ  <input type="checkbox" name="piyo[]" value="1" />ピヨ  <input type="checkbox" name="puyo[]" value="1" />プヨ  ホゲをクリックしたら、value="1"になるかと思うのですが、 このvalue部分を動的に生成することはできるでしょうか? 例えば、ホゲをクリックしたら(ホゲをクリックした時だけ)、 自動的に、 <input type="checkbox" name="hoge[]" value="1" /> <input type="checkbox" name="hoge[]" value="2" /> <input type="checkbox" name="hoge[]" value="3" /> <input type="checkbox" name="hoge[]" value="4" /> <input type="checkbox" name="hoge[]" value="5" /> <input type="checkbox" name="hoge[]" value="6" /> <input type="checkbox" name="hoge[]" value="7" /> <input type="checkbox" name="hoge[]" value="8" /> <input type="checkbox" name="hoge[]" value="9" /> をクリックしたのと同じ処理が走るよう、スクリプトで書くには、 どうすればよいでしょうか?

  • 変数に入っているのに、メールで送ると格納されてない

    こんな感じでチェックボックスを作りました。 <td><input type="checkbox" name="youbi" value="月1"></td> <td><input type="checkbox" name="youbi" value="火1"></td> <td><input type="checkbox" name="youbi" value="水1"></td> <td><input type="checkbox" name="youbi" value="木1"></td> 複数選択し、 $youbiの変数データをブラウザに表示すると、ちゃんと「月1、火1、水1」 と表示されます。 これをそのままメールで送ろうとしたところ、 $youbiを表示すると、「月1」しかメール本文に表示されていません。 どうやったらちゃんとメールに表示できるようになるでしょうか?

  • チェックボックスのデータの受け取り方について

    以下のようなチェックボックスを作ったとき、 test.phpではどうやって受け取ればよいのでしょうか? nameがそれぞれ違う場合は分かるのですが... 教えてください。 <form method="POST" action="test.php"> <input type="checkbox" name="color" value="red">赤</input> <input type="checkbox" name="color" value="blue">青</input> <input type="checkbox" name="color" value="white">白</input> <input type="checkbox" name="color" value="black">黒</input> <input type="submit" value="送信" > </form>

    • ベストアンサー
    • PHP
  • チェックボックスの戻り

    チェックボックスのvalue値に数字を入れてPOSTしています。 DB登録の前にその値を足し算してDBに登録しています。 <input type="checkbox" name="cb[0]" value="1"> <input type="checkbox" name="cb[1]" value="2"> <input type="checkbox" name="cb[2]" value="4"> <input type="checkbox" name="cb[3]" value="8"> <input type="checkbox" name="cb[4]" value="16"> ・・・のようにしています。DBの値を読み取ってcheckedを付ける際はどのようにしたら効率よく処理できるでしょうか?switchを使うとすごくチェックボックスの数が増えると厄介です。困っています。教えてください。

    • ベストアンサー
    • PHP

専門家に質問してみよう