広告

php select 選択状態を保持する

この記事は約8分で読めます。

phpでformを作っていて、google reCAPTCHA v3 を使うと、requiredを使って必須入力項目のチェックができません。(2分以内の送信に限ればrequiredが使えるけど・・・)

そこで、下記の流れで処理します。

submit(送信)
↓↓↓
サニタイズ
↓↓↓
エラー確認(必須項目の入力チェック)
↓↓↓
エラーがあるなら、入力画面に戻す

エラーがあるとき、入力画面に戻るとき、<input>要素なら、

<input type="text" name="zipcode" class="p-postal-code" size="8" maxlength="8" value="<?php if ( ! empty( $clean['zipcode'] ) ) { echo esc_attr( $clean['zipcode'] ); } ?>">

こんな風に、valueに書き込みます。

$clean['zipcode']は、$_POST['zipcode']$_GET['zipcode']をサニタイズ処理したものです。esc_attr()はWordPressでHTML 要素の属性(alt, value, title, class など)の値に出力する文字をエスケープします。サニタイズ処理が2重になっている感じがありますが、esc_attr()は既にエスケープ処理されている場合はそのままですので、速度が遅くなりサーバーに負担がちょっとかかりますが問題ありません。

チェックボックスなら、こんな感じです。(input要素にcheckedを入れればOK)

<input id="ck1" type="checkbox" name="ck1" <?php if ( ! empty( $clean['ck1'] ) ) { echo 'checked'; } ?> >

select はちょっとコツがいる

selectは、option要素にselectedを入れることで、選択状態を保持できます。

1つ1つにphpを入れて判定させても、良いのですが何個もあると大変です。

<select name="mi">
    <option value="なし" <?php if ( ! empty( $clean['mi'] ) ) { if ( 'なし' === $clean['mi'] ) { echo 'selected'; } } ?>>なし</option>
    <option value="あり" <?php if ( ! empty( $clean['mi'] ) ) { if ( 'あり' === $clean['mi'] ) { echo 'selected'; } } ?>>あり</option>
</select>

そこで、選択項目を連想配列にして、foreachを使って簡単に処理しちゃいましょう。

<select name="pref" class="p-region-id">
    <option value=""></option>
    <?php
        foreach ( $prefs as $key => $pref ) {
            if ( ! empty( $clean['pref'] ) ) {
                if ( $key === $clean['pref'] ) {
                    echo '<option value="' . $key . '" selected>' . $pref . '</option>';
                } else {
                    echo '<option value="' . $key . '">' . $pref . '</option>';
                }
            } else {
                echo '<option value="' . $key . '">' . $pref . '</option>';
            }
        }
    ?>
</select>

説明がちょっと難しいのですが・・・

$prefsはキーが数字、値が都道府県の連想配列です。

$prefs = array(
    '1'  => '北海道',
    '2'  => '青森県',
    '3'  => '岩手県',
・・・
    '47' => '沖縄県',
);

連想配列をforeachで回して、optionを作ります。

最初は、$clean['pref']があるなしをif ( ! empty( $clean['pref'] ) )で判断します。

これをしないとエラーが出ます。

送信ボタンを押すと、optionのvalueの値が、$_POST['pref']$_GET['pref']に入るので、サニタイズ処理して$clean['pref']

$clean['pref']が該当する(選択したもの)がforeachで回ってきたら、selectedがある方が出力されて、選択状態を保持できます。

説明が難しい・・・

ちなみに、郵便番号を入力すると自動で入力してくれるyubinbango.jsを使って、都道府県をプルダウン表示する目的で作っています。

option要素のvalueと表示する文字列が同じなら、配列でもOKです。

<?php
$k_array = array(
    '責任者',
    'A士',
    'B師',
    'その他'
);
?>
<select name="k">
    <option value=""></option>
    <?php
    foreach ( $k_array as $value ) {
        if ( ! empty( $clean['k'] ) ) {
            if ( $value === $clean['k'] ) {
                echo '<option value="' . $value . '" selected>' . $value . '</option>';
            } else {
                echo '<option value="' . $value . '">' . $value . '</option>';
            }
        } else {
            echo '<option value="' . $value . '">' . $value . '</option>';
        }
    }
    ?>
</select>

WordPressで使ったので、if文がヨーダ記法になっています。ご注意ください。