PHPでラジオボタンの状態を引き継ぐ

(1/1)
HTML は、1 回のリクエストとレスポンスの間に、「接続→通信→切断」という一連の処理が行われる。このため、前のページの状態をいったん保管しないと、その状態を引き継ぐことができない。そこで、GET 変数や POST 変数、セッション変数、Cookie を使って引き継ぐことになる。
HTML フォームで入力されたテキストは、GET 変数や POST 変数で引き継ぐことができる。では、ラジオボタンの状態はどうやって引き継げばいいだろうか。

(2021 年 4 月 11 日)PHP8 対応,リファラ・チェック追加.

目次

サンプル・プログラムの実行例

PHPでラジオボタンの状態を引き継ぐ
サンプル・プログラム checked1.php を実行してみてほしい。
ラジオボタンをチェックして「実行」ボタンを押下する。すると、画面表示は全く変わらないが、タイトル右横の「回数」は増えている。
じつは、きちんと画面遷移は行われている。そして、ラジオボタンの状態も引き継がれているのである。
その仕組みを説明しよう――。

サンプル・プログラム

圧縮ファイルの内容
checked1.phpサンプル・プログラム本体。

解説:checked属性の付け方

0141:     //処理選択ラジオボタン
0142:     $str_radio = '';
0143:     $i = 1;
0144:     foreach ($RailWays as $key=>$val) {
0145:         $str_radio .= "<input type=\"radio\" name=\"railway\" value=\"{$key}\" {$val} />{$key}<br />\n";
0146:         $i++;
0147:     }

ラジオボタンは、HTML フォームに name="railway" として配置している。
選択されたラジオボタンの value の値は、POST 変数 $_POST['railway'] に格納される。そこで、$_POST['railway'] の値があるラジオボタンに checked 属性を付加すればいい。
では、どうやってその判断を行うか――ここでは、連想配列を使うことにする。

0186: //checkedを設定する
0187: else if (isset($_POST['railway'])) {
0188:     $val = mb_convert_encoding($_POST['railway'], INTERNAL_ENCODING, 'auto');
0189:     $RailWays[$val] = 'checked';
0190: }

あらかじめ連想配列 $RailWays を用意する。
添え字はラジオボタンの value の内容と同じである。値として、NULL または 'checked' を入れるようにするのである。

この方法は、もちろん GET 変数でもそのまま適用できる。

解説:連想配列作成支援

0098: /**
0099:  * 文字列から連想配列を生成する
0100:  * @param string $delimiter 区切り文字
0101:  * @param string $str $delimiterで区切られた文字列
0102:  * @param array  $arr 連想配列を格納する領域
0103:  * @return int 連想配列の要素数
0104: */
0105: function explodeArray($delimiter$str, &$arr) {
0106:     $arr2 = explode($delimiter$str);
0107:     $cnt = 0;
0108:     foreach ($arr2 as $val) {
0109:         $arr[$val] = NULL;       //値の初期値
0110:         $cnt++;
0111:     }
0112:     return $cnt;
0113: }

おまけ機能として、連想配列 $RailWays を用意するためのユーザー関数 explodeArray を用意した。

このユーザー関数は、カンマで区切られた文字列 '中央線,総武線,山手線,京浜東北線,埼京線,湘南新宿ライン' を渡すと、連想配列

$RailWays['中央線'] = NULL
$RailWays['総武線'] = NULL
$RailWays['山手線'] = NULL
...


を返してくれるというものである。
長大なラジオボタンのリストを作るのは面倒だ。この関数を利用していただければ幸いである。

参考サイト

(この項おわり)
header