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

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

ただいまの
回答率

87.49%

PHP セッションを使用したフォーム 出力について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 5,091

score 30

PHP初心者です。

実装したいところ
→元の画面に戻ったときに選択した入力値を保持したままにしときたいです(現在は初期値に戻ってしまう為)

※エラー時は入力値確認ページには遷移せずに直接入力ページに遷移するようになっています※var_dumpで確認したところ出力では入力値がとれているのでセレクトボックスの表示だけが変わらない状態です。



できれば簡単なif文で処理したいのですがどのような書き方がいいのでしょうか?
ご教示お願い致します。


<td class="aiueo">
<td>
<select name="prefecture" id="prefecture" value = "<?php if (isset($_SESSION['prefecture'])) { echo $_SESSION['prefecture']; } ?>">
<br>

<option value="">都道府県の選択</option>
<option value="北海道"   >北海道</option>
<option value="青森県"   >青森県</option>
<option value="岩手県"   >岩手県</option>
....中略
</select></td>
</tr>


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+3

<?php
opcache_invalidate(__FILE__, true);

$arrPref = [
    '北海道', '青森県', '岩手県', '宮城県', '秋田県'
    , '山形県', '福島県', '茨城県', '栃木県', '群馬県'
    , '埼玉県', '千葉県', '東京都', '神奈川県', '新潟県'
    , '富山県', '石川県', '福井県', '山梨県', '長野県'
    , '岐阜県', '静岡県', '愛知県', '三重県', '滋賀県'
    , '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県'
    , '鳥取県', '島根県', '岡山県', '広島県', '山口県'
    , '徳島県', '香川県', '愛媛県', '高知県', '福岡県'
    , '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県'
    , '鹿児島県', '沖縄県'
];

function h($string)
{
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

//更新処理
if (null != filter_input_array(INPUT_POST)) {

    //初期化
    $err = [];

    //    バリデーション処理
    if ("" == filter_input(INPUT_POST, 'prefecture')) {
        $err['prefecture'] = '都道府県を選択してください。';
    }

    //エラーがない時の処理
    if (0 == count($err)) {
        header("location: next.php");
    }
}
?>
<!DOCTYPE HTML>
<html lang = "ja-JP">
    <head>
        <meta charset = "UTF-8">
        <title></title>
    </head>
    <body>
        <form action="" method="post">
            <select name="prefecture">
                <?php foreach ($arrPref as $strPref) { ?>
                    <option value="">----</option>
                    <?php if ($strPref == filter_input(INPUT_POST, 'prefecture')) { ?>
                        <option value="<?= h($strPref) ?>" selected="selected">
                            <?= h($strPref) ?>
                        </option>
                    <?php } else { ?>
                        <option value="<?= h($strPref) ?>">
                            <?= h($strPref) ?>
                        </option>
                    <?php } ?>
                <?php } ?>
            </select>
            <?php if (isset($err['prefecture'])) { ?>
                <p><?php echo h($err['prefecture']); ?></p>
            <?php } ?>
            <button type="submit">登録</button>
        </form>
    </body>
</html>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/08 16:37

    元の画面に戻ったときに選択した入力値を保持したままにしとく為の部分はどこにあたるのでしょうか?

    キャンセル

  • 2015/10/08 16:38 編集

    <?php if ($strPref == filter_input(INPUT_POST, 'prefecture')) { ?>
    <option value="<?= h($strPref) ?>" selected="selected">
    <?= h($strPref) ?>
    </option>
    <?php } else { ?>

    コピペで動くソースを提示したのですから、実行さえすればわかるはずですが…
    そもそも、あなたのやりたいことを実現するのに、SESSIONは不要です。

    キャンセル

0

以下のように、onloadのイベントで、javascriptで設定するのでは、いかがでしょうか?
<script type="text/javascript">
var select_data = <?php echo isset($_SESSION['prefecture'])?"'".$_SESSION['prefecture']."'":"''"; ?>;

function body_init(){
    var options = document.getElementById('prefecture').options;
    for(var i = 0; i < options.length; i++){
        if(options[i].value === select_data){
            options[i].selected = true;
            break;
        };
    };
};
</script>
</head>
<body onload="body_init();">
<select name="prefecture" id="prefecture">
<option value="">都道府県の選択</option>
<option value="北海道"   >北海道</option>
<option value="青森県"   >青森県</option>
<option value="岩手県"   >岩手県</option>
</select>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/07 15:39

    PHPの学習をしてるので今回はjsは封印して実装したいなあと思っておりました....
    jsでの実装時には是非ソースの方参考にさせていただきます!ありがとうございます。

    キャンセル

0

フォーム表示のPHPと、入力を受け付けるPHPが別なのでしょうか?
サンプルで書かれているのがフォーム表示側だけなので、別なのだなと解釈しました。


フォーム表示側では、セッションに値が入っていなければ、初期値をセッションへ設定。optionを出力するところでセッションと同じ値なら"selected"を出力。

入力受付側では、渡された内容をセッションへ入れる。
エラーがあればフォーム表示へリダイレクト。
入力がOKならセッションの値を削除。

で、できます。
この場合、エラーでフォーム画面へ戻ったあとに別画面へ行って、再度フォームを開くと、先ほど選択したものが選ばれている状態になります。戻したい場合はフォーム入力画面にも初期化のフラグを付けて、任意に初期化できるようにすると良いでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/13 13:43 編集

    回答ありがとうございます。表示と入力を受け付けるphpは別になっています。
    質問部分に追記させていただいたのですがvar_dumpでは入力値がとれているのでセッションにはデータが入ってると思うのですが、selectedの使い方が悪いのかセッションデータがこれでは取れていないのかどっちになるんでしょうか?

    キャンセル

  • 2015/10/13 13:47

    そもそも、例で上がっているPHPから出力されるHTMLは
    <select value="値2">
    <option value="値1">選択肢1</option>
    <option value="値2">選択肢2</option>
    </select>
    というHTMLが生成されますが、
    <select>
    <option value="値1">選択肢1</option>
    <option value="値2" <?php if(セッション値==値2) echo "selected" ?> >選択肢2</option>
    </select>
    じゃないんですか?

    キャンセル

0

selectのoption 文には、 "selected"を付加しないと選択状態にはなりません。

■選択前
<option value="">都道府県の選択</option>
<option value="北海道"   >北海道</option>
<option value="青森県"   >青森県</option>
<option value="岩手県"   >岩手県</option>
....中略
</select>

■選択後(青森県が選択状態)
<option value="">都道府県の選択</option>
<option value="北海道"   >北海道</option>
<option value="青森県"   selected>青森県</option>
<option value="岩手県"   >岩手県</option>
....中略
</select>

私がよく行う手法は、option文丸ごとphpで出力する方法です。
例では、県の比較を文字そのままで行っていますが、valueを数値化にして比較する方法の方が無難かと思います。
また、例は文字コードのことを考慮していないので、utf-8、sjisなど環境に合わせて調整する必要があるかと思います。

<?php

$prefecture = array(
'北海道', '青森県', '岩手県', '宮城県', '秋田県',
'山形県', '福島県', '茨城県', '栃木県', '群馬県',
'埼玉県', '千葉県', '東京都', '神奈川県', '新潟県',
'富山県', '石川県', '福井県', '山梨県', '長野県',
'岐阜県', '静岡県', '愛知県', '三重県', '滋賀県',
'京都府', '大阪府', '兵庫県', '奈良県', '和歌山県',
'鳥取県', '島根県', '岡山県', '広島県', '山口県',
'徳島県', '香川県', '愛媛県', '高知県', '福岡県',
'佐賀県', '長崎県', '熊本県', '大分県', '宮崎県'
'鹿児島県', '沖縄県'
);

function select_prefecture($select=null)
{
    global $prefecture;

    // 出力バッファ初期化
    $out_buff = null;

    foreach($prefecture as $name)    // 県名分
    {
        // セレクトを初期化
        $selected = null;

        if ($select == $name)    // 選択されている県 ?
        {
            // セレクトセット
            $selected = " selected";
        }

        // OPTION文を出力
        $out_buff .= "<option value=\"${name}\"${selected}>${name}</option>";
    }

    // 処理終了
    return $out_buff;
}

?>



<td class="aiueo">
<td>
<select name="prefecture" id="prefecture">
<option value="">都道府県の選択</option>
<?php
if (isset($_SESSION['prefecture']) == true)    // セッションで県が設定されている ?
{
    // 県名セット
    $prefecture = $_SESSION['prefecture'];
}
else
{
    // 初期化
    $prefecture = null;
}

// option文を出力
echo select_prefecture($prefecture);
?>
</select>
</td>
</tr>
コード

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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