質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.51%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,733

score 4

前提・実現したいこと

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

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

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

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

該当のソースコード

<form method="post" action="confirm.php">
<li>
<label>性別</label>
<input  type="radio" name="gender" value="0" <?php if( !empty($_POST['gender']) && $_POST['gender'] === "0" ){ echo 'checked'; } ?>>男
<input  type="radio" name="gender" value="1" <?php if( !empty($_POST['gender']) && $_POST['gender'] === "1" ){ echo 'checked'; } ?>>女
</li> 

<li>
<label>都道府県</label>
<select class="dropdown" name="prefecture">
<option value=""disabled style="display:none;" <?php if(empty($_POST['prefectur'])) echo 'selected'; ?>></option>            
<option value="北海道" <?php if( !empty($_POST['prefectur']) && $_POST['prefectur'] === "北海道" ){ echo 'selected'; } ?>>北海道</option>
<option value="青森県" <?php if( !empty($_POST['prefectur']) && $_POST['prefectur'] === "青森県" ){ echo 'selected'; } ?>>青森県</option>
|
|
|
|
|
同様に47都道府県
</form>
<li>
<label>性別</label>
<?php 
if ( $_POST['gender'] === "0" ){ echo '男'; }
else { echo '女'; 
}
?>
</li>

<li>
<label>都道府県</label>
<?php 
echo $_POST['prefecture'];
?>
</li>

<form method="post" action="regist.php">
<input type="submit" class="button1" value="前に戻る">
<input type="hidden" value="<?php echo $_POST['gender']; ?>" name="gender">
<input type="hidden" value="<?php echo $_POST['prefecture']; ?>" name="prefecture">
</form>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

都道府県

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

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

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

<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
    echo $_POST['gender'];
    echo $_POST['prefecture'];
    if( !empty($_POST['gender']) && $_POST['gender'] === "0" ){
       echo '男';
    }
    if( !empty($_POST['gender']) && $_POST['gender'] === "1" ){
        echo '女';
    }
    if( !empty($_POST['prefecture']) && $_POST['prefecture'] === "北海道" ){
        echo '北';
    }
    if( !empty($_POST['prefecture']) && $_POST['prefecture'] === "青森県" ){
        echo '青';
    }
}
?>
<form method="post" action="confirm.php">

あとは機能の仕様。

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

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

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

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

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

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

<?php
$gender = ['0'=>'男','1'=>'女'];

foreach($gender as $value=>$label){
    $checked = (filter_input(INPUT_POST,'gender') == $value) ? ' checked' : '';
    echo <<<GENDER
    <input  type="radio" name="gender" value="{$value}"{$checked}>{$label}
GENDER;
}

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/20 22:38

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

    ありがとうございました。

    キャンセル

  • 2021/01/21 06:41

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

    キャンセル

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

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る