🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

4155閲覧

ラジオボタンとプルダウンの入力保持の仕方

sorito

総合スコア4

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/01/19 15:50

編集2021/01/19 15:55

前提・実現したいこと

入力→確認→登録の流れのフォームを作成中です。
確認画面の前に戻るボタンを押して、修正のため入力画面に戻った際に値の保持をしたいのですがラジオボタン(性別)とプルダウン(都道府県)のみ値の保持の仕方が分かりません。
性別は男を初期値に設定したいです。

ご教授お願いいたします。

発生している問題・エラーメッセージ

ラジオボタンは女のみ値保持ができています。ソースコードを見てもなぜか女を選択した時のみcheckedが入っています。 都道府県は値保持ができず空欄のままです。

該当のソースコード

regist.php(登録画面)

1 2<form method="post" action="confirm.php"> 3<li> 4<label>性別</label> 5<input type="radio" name="gender" value="0" <?php if( !empty($_POST['gender']) && $_POST['gender'] === "0" ){ echo 'checked'; } ?>>男 6<input type="radio" name="gender" value="1" <?php if( !empty($_POST['gender']) && $_POST['gender'] === "1" ){ echo 'checked'; } ?>>女 7</li> 8 9<li> 10<label>都道府県</label> 11<select class="dropdown" name="prefecture"> 12<option value=""disabled style="display:none;" <?php if(empty($_POST['prefectur'])) echo 'selected'; ?>></option> 13<option value="北海道" <?php if( !empty($_POST['prefectur']) && $_POST['prefectur'] === "北海道" ){ echo 'selected'; } ?>>北海道</option> 14<option value="青森県" <?php if( !empty($_POST['prefectur']) && $_POST['prefectur'] === "青森県" ){ echo 'selected'; } ?>>青森県</option> 151617181920同様に47都道府県 21</form> 22

confirm.php(確認画面)

1 2<li> 3<label>性別</label> 4<?php 5if ( $_POST['gender'] === "0" ){ echo '男'; } 6else { echo '女'; 7} 8?> 9</li> 10 11<li> 12<label>都道府県</label> 13<?php 14echo $_POST['prefecture']; 15?> 16</li> 17 18<form method="post" action="regist.php"> 19<input type="submit" class="button1" value="前に戻る"> 20<input type="hidden" value="<?php echo $_POST['gender']; ?>" name="gender"> 21<input type="hidden" value="<?php echo $_POST['prefecture']; ?>" name="prefecture"> 22</form> 23

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

都道府県

nameとPOSTで指定しているkeyが合っていません。
name : prefecture
post : prefectur

あとはvar_dump()でデバッグしつつ、ですね。

HTML度外視でまずはやってみてください。
regist.phpのほうでもひとまず冒頭で選択した情報を出す。
同じ分岐で書いてみる。

php

1<?php 2if($_SERVER['REQUEST_METHOD'] === 'POST'){ 3 echo $_POST['gender']; 4 echo $_POST['prefecture']; 5 if( !empty($_POST['gender']) && $_POST['gender'] === "0" ){ 6 echo '男'; 7 } 8 if( !empty($_POST['gender']) && $_POST['gender'] === "1" ){ 9 echo '女'; 10 } 11 if( !empty($_POST['prefecture']) && $_POST['prefecture'] === "北海道" ){ 12 echo '北'; 13 } 14 if( !empty($_POST['prefecture']) && $_POST['prefecture'] === "青森県" ){ 15 echo '青'; 16 } 17} 18?> 19<form method="post" action="confirm.php">

あとは機能の仕様。

empty()

返り値
var が存在し、かつその値が空や0でなければ、 つまり boolean のコンテキストで false と見なされる場合、false を返します。

つまりempty($_POST['gender'])は「男」を選択した「0」のときは必ずempty()はtrueが返っています。
emptyを使う際の注意点です。
0を「空である」と判定します。

php

1var_dump(empty(0)); //true 2var_dump(empty('0')); //true 3var_dump(empty(1)); //false 4var_dump(empty('1')); //fals

ユーザーからの入力は何が来るか分からない…と言う点でempty()でチェックするのは悪手だと考えられます。
ブラウザのデベロッパーツールから書き換えればhiddenからだって0を送れます。prefectureのほうも改ざん可能です。
「keyが存在したら」とう観点ならisset()でも良いのですけど、
prefectureの方もですが、filter_input()の利用を強くすすめます。

php

1<input type="radio" name="gender" value="0" <?php if( filter_input(INPUT_POST,'gender') === "0" ){ echo 'checked'; } ?>>2<input type="radio" name="gender" value="1" <?php if( filter_input(INPUT_POST,'gender') === "1" ){ echo 'checked'; } ?>>3

あと、今回ミスってたprefectureのことも踏まえると、
入力項目は配列で定義しておいて出力したほうがいいんじゃないかなと。
手動での作業を増やすことは、それだけミスやバグの可能性を高めます(コピペも「コピーする範囲の選択」は手動です)。

php

1<?php 2$gender = ['0'=>'男','1'=>'女']; 3 4foreach($gender as $value=>$label){ 5 $checked = (filter_input(INPUT_POST,'gender') == $value) ? ' checked' : ''; 6 echo <<<GENDER 7 <input type="radio" name="gender" value="{$value}"{$checked}>{$label} 8GENDER; 9}

蛇足1:
流れは入力→確認画面→完了でしょうか。
hiddenに保持した場合、先に書いたようにブラウザのデベロッパーツールから値や内容を改ざんできるので、
セッションに保持したほうが良いです。
なんでもかんでも送れてはいけないので、バリデーションも入れましょう。

蛇足2:
XSSが可能な作りになっています。
「そもそもXSSとは」というところを調べたうえで適切に対応してください。

蛇足3:
性別の選択って結構センシティブなものなので、
学習中かもしれませんが、今後のことも加味してある程度気にされたほうが良いです。
ダイバーシティ時代に「性別を選択する」ということ

投稿2021/01/19 19:20

編集2021/01/19 22:53
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sorito

2021/01/20 13:38

解決しました! 現在独学で勉強中のため調べても分からないところがたくさんありましたがm.ts10806様の丁寧な解説とご意見大変参考になりました。 ありがとうございました。
m.ts10806

2021/01/20 21:41

きている情報を確認してみておかしいなと思ったらまずはドキュメントを確認するようにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問