![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
今まで、PHP5+MySQL5で、ラジオボタンをつかったPHPフォームを少し作った経験がありますが、チェックボックスを使った経験がなく、PHPフォームやMySQLのDB構成の基本的なところの考え方でつまづきました。
以下の好きな球技のアンケートをとると仮定した具体例で、考え方などアドバイスいただけると幸いです。
(1) HTML側は、こういうチェックボックス
[ ]野球
[ ]蹴球
[ ]庭球
(2) MySQL側は、こういうテーブルが作ってあり、チェックが入っていたら「1」をINSERT。
`kyugi1` char(1) default NULL COMMENT '好きな球技(野球)',
`kyugi2` char(1) default NULL COMMENT '好きな球技(蹴球)',
`kyugi3` char(1) default NULL COMMENT '好きな球技(庭球)',
(3) で、あとでこのアンケート結果を集計リストアップするための別ページを作る際に、こういう検索フォームを設け、
<form>
<input type="checkbox" value="0" name="kyugi[]"<?php if ($_GET["kyugi"] == 0) { echo " checked";} ?>野球
<input type="checkbox" value="1" name="kyugi[]"<?php if ($_GET["kyugi"] == 1) { echo " checked";} ?>蹴球
<input type="checkbox" value="2" name="kyugi[]"<?php if ($_GET["kyugi"] == 2) { echo " checked";} ?>庭球
</form>
(4) その際、SQL文を作ろうとしたら、「あれ?」となりました。
if(is_array($_GET["sports"])){
$sql = " select * from mytable where sports in ('" . implode("','", $_GET["sports"]) . "')";
}
【質問1】「ラジオボタンのように択一した(1つを選ぶ)」レコードなら、(3) (4) のような抽出方法で今までうまくやってきましたが、
「チェックボックスのように複数選択された」レコードだと、MySQL側には、全ての選択肢(ここでは野球、蹴球、庭球の3つ)について
フィールドを儲けなければならないですよね?例えば、kyugi1、kyugi2、kyugi3とか、baseball、football、tennisで、チェック入っていたら1、入っていなければ0を
Insertするとか。
「kyugi」というフィールドに、選択された複数のvalue(012、02、12、などと)を格納する、なんてやり方はしませんよね?
【質問2】チェックボックスの選択肢は、今はまだ野球、蹴球、庭球の3つだけですが、いずれ配球、篭球。。。と増加する可能性があります。
この場合、以下のようなマスターを設けて切り出した方がメンテナンス性良いでしょうか?この程度ならそこまで拡張しなくていいでしょうか?
kyugiID/kyuginame
0/野球
1/蹴球
2/庭球
【質問3】(3)の検索フォームですが、
野球だけチェックして検索したら、野球だけchekedを残したいから
<?php if ($_GET["kyugi"] == 0) { echo " checked";}
というのを仕込んでありますが、
はじめに当該フォームのHTMLページに飛んできたときは、既定値としてmすべてのチェックボックスにチェックを入れておきたいのですが、妙案ないでしょうか。。。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
1.
複数の列(column)をレコードに持たせる設計は悪手です。
複数個の値を扱うならば、
複数レコードに分けるか、JSON 型の配列として持たせましょう。
参考) 最近の MySQL なら JSON 型の配列でも効率よく検索できます
https://dev.mysql.com/doc/refman/8.0/ja/create-i …
2.
マスターを持たせたほうが都合がよいでしょう。
<form> 内もマスターを使った foreach で簡略化できます。
例)
$sports_master = array( ["val"=>1, "name"=>"野球"], ... );
...
<?php foreach ($sports_master as $m) { ?>
<label>
<input name="c[]" value="<?= $m['val'] ?>">
<?= $m['name'] ?>
</label>
<?php } ?>
3.
検索ボタンを押したか判別する GET/POST 引数を用意して、
引数が無ければ全有効としてはいかがでしょう
例)
<button type=submit name=z>送信</button>
...
if (!isset($_GET['z'])) { // 引数に z が無い → ボタン押してない
_ $checked = true;
} else {
_ $checked = 引数からチェック有無を判定する処理();
}
Ogre7077さん、わかりにくい説明に1問ずつご回答ありがとうございます。
> 複数の列(column)をレコードに持たせる設計は悪手です。
> 複数個の値を扱うならば、複数レコードに分けるか、
やはり悪手なんですね。しかし、好き・嫌いを1と0で表すと、
球技の数だけ列(column)をレコードに持たさざるをえない発想から抜け出せません、
野球 蹴球 庭球
回答者1 1 0 1
回答者2 1 0 0
回答者3 1 1 1
回答者4 1 1 0
回答者5 0 0 1
:
:
あと、URLお示しいただいた「JSON 配列のインデックス付け」は環境がMySQL5なのと、ちょっと私には高度過ぎるかもしれません、、、(せっかくなのにすみません)
2は目からうろこ、具体的コードご提示もありがとうございます。是非マスター化してみます。
3も引数が無ければ全有効、というお示しのコードでよくイメージ
できました、適用させていただきます!!
No.3
- 回答日時:
No.2 の補足
> 球技の数だけ列(column)をレコードに
次善の案として、
一つの列に、有効無効の桁を複数並べた文字列は如何でしょうか。
like 句を使ったパターンマッチ検索なので、
他案に比べて速度的には不利になりますのでご了承ください。
insert into 表(sports) values ('101'); -- 野球と庭球は有効
insert into 表(sports) values ('011'); -- 蹴球と庭球は有効
select * from 表 where sports like '1__'; -- 野球が有効
select * from 表 where sports like '_11'; -- 蹴球と庭球の両方が有効
参考)
https://dev.mysql.com/doc/refman/5.6/ja/pattern- …
Ogre7077さん、度々ありがとうございます。
そんなシビアなWebシステムではないので、速度は構わないのですが
仰せのような発想はなかったです!
ご提示いただいた方法含めてシンプルかつメンテ性が高そうな方策を検討してみます。
No.1
- 回答日時:
テーブル構成はもうすこしねったほうがよいでしょう。
getの受け渡しはこんな感じ
<?PHP
$kyugi=filter_input(INPUT_GET,"kyugi",FILTER_VALIDATE_INT,FILTER_REQUIRE_ARRAY);
$checked["kyugi"]=[0=>"",1=>"",2=>""];
if($kyugi){
foreach($kyugi as $val){
$checked["kyugi"][$val]=" checked";
}
}
?>
<form>
<label><input type="checkbox" value="0" name="kyugi[]"<?=$checked["kyugi"][0]?>>野球</label>
<label><input type="checkbox" value="1" name="kyugi[]"<?=$checked["kyugi"][1]?>>蹴球</label>
<label><input type="checkbox" value="2" name="kyugi[]"<?=$checked["kyugi"][2]?>>庭球</label><br>
<input type="submit" value="send">
</form>
yamabejpさんご無沙汰しております、具体的なコードでお示しいただきありがとうございます。いつも本番環境にそのまま適用できる実用的なサンプルをいただき、いくつも今でも使わせていただいております。
filter_inputの一行はチンプンカンプンなワザを一つずつ解読してみますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
いちばん失敗した人決定戦
あなたの「告白」での大失敗を教えてください。
-
もし10億円当たったら何に使いますか?
みなさんの10億円プランが知りたいです!
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
【お題】斜め上を行くスキー場にありがちなこと
運営も客も一流を通り越して斜め上を行くスキー場にありがちなことを教えて下さい。
-
データベースの値を判断してラジオボタンにセットする方法
Java
-
<input type=hidden" >で配列(複数の要素)を渡したいとき?"
PHP
-
tableタグとformタグの組み合わせ
HTML・CSS
-
-
4
ラジオボタンの値を受け取ってPHPで表示する初歩的文法
PHP
-
5
セッションを使わずに遷移先画面に変数の値を渡すには?
PHP
-
6
複数のラジオボタングループを動的に作成するには?
PHP
-
7
PHPで、エラーがない場合のみ画面遷移させたい
PHP
-
8
チェックボックスを用い、MySQLからデータを取得
PHP
-
9
PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?
PHP
-
10
チェックボックスの項目をDBにinsertしたい
MySQL
-
11
DBの値をチェックボックスに反映させたい
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【初歩】ラジオボタンをつかっ...
-
GROUP BYを行った後に結合した...
-
実績累計の求め方と意味を教え...
-
アクセスでレポートの1印刷内...
-
MERGE文を単体テーブルに対して...
-
Accessで日付が変わると番号が...
-
Line Inputで文字化け(助けて...
-
GROUP BYを使ったSELECT文の総...
-
VB.netでmdbのレコードを取得
-
DataGridViewの内容をDBに反映...
-
Access でレコードセレクタが押...
-
キーが同じを複数行を1行にま...
-
固有レコード識別子の選択とは
-
OracleのSQL*PLUSで、デー...
-
差し込み印刷のレコード数について
-
【SQL】existsでの商演算
-
Recordset.FindFirstについて
-
レコードが存在しなかった場合
-
【Access】選択クエリのグルー...
-
Excel VBA:セルを新旧1つずつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL文で右から1文字だけ削除す...
-
使うべきでない文字。
-
MySQLで MAX()とGROUP BYを使う...
-
割合(パーセント)を求めるに...
-
【初歩】ラジオボタンをつかっ...
-
【MYSQL】asでリネームしてwher...
-
sum()の出力結果順に並び替えを...
-
カウント結果を1レコードの中...
-
SQLの集計で「全て」の合計も表...
-
何にかが違うから エラーなんで...
-
MySQL のデータからドロップダ...
-
チェックボックスの項目をDBにi...
-
replaceを使って更に重複レコー...
-
表示幅を短くしたい
-
LIKE述語/SQLとPHPを使った検...
-
MySQLにて特定レコードのみを抽...
-
phpmyadminはトリガーやIF文を...
-
複数の表の条件でのDELETE文
-
初心者Mysqlの関数のsubstring...
-
MySQLで変数やループ、上位3名...
おすすめ情報
すみません、本当にそのまま使えるGETの受け渡しをいただいて感謝感謝なのですが、ベストアンサーが1つしか選べないようで、今回すみません。