PHPで年月日を入力(プルダウン方式)

(1/1)
PHPでプルダウンメニューを使って年月日を入力するフォームを作る。日数は大の月と小の月によって変わるようにし、とくに閏年の2月の入力に気をつける。

(2021年4月24日)PHP8対応,リファラ・チェック改良

サンプル・プログラム

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

ある年月に対応する日数をプルダウンメニューにする

0176:     //表示用HTML
0177:     $outstr = '';
0178: //--プルダウンメニュー
0179:     if ($mode) {
0180:         $name = 'exec';
0181: //--年
0182: $outstr .=<<< EOT
0183: <select name="year" onChange="submit();">
0184: 
0185: EOT;
0186:     for ($y = $year - 3; $y <= $year + 3; $y++) {
0187:         $selected = ($y == $year) ? 'selected' : '';
0188: $outstr .=<<< EOT
0189: <option value="{$y}" {$selected}>{$y}</option>
0190: 
0191: EOT;
0192:     }
0193: $outstr .=<<< EOT
0194: </select>年
0195: 
0196: EOT;
0197: 
0198: //--月
0199: $outstr .=<<< EOT
0200: <select name="month" onChange="submit();">
0201: 
0202: EOT;
0203:     for ($m = 1; $m <= 12; $m++) {
0204:         $selected = ($m == $month) ? 'selected' : '';
0205: $outstr .=<<< EOT
0206: <option value="{$m}" {$selected}>{$m}</option>
0207: 
0208: EOT;
0209:     }
0210: $outstr .=<<< EOT
0211: </select>月
0212: 
0213: EOT;
0214: 
0215: //--日
0216:     $dd = getDaysInMonth($year$month);
0217: $outstr .=<<< EOT
0218: <select name="day" onChange="submit();">
0219: 
0220: EOT;
0221:     for ($d = 1; $d <= $dd$d++) {
0222:         $selected = ($d == $day) ? 'selected' : '';
0223: $outstr .=<<< EOT
0224: <option value="{$d}" {$selected}>{$d}</option>
0225: 
0226: EOT;
0227:     }
0228: $outstr .=<<< EOT
0229: </select>日
0230: 
0231: EOT;
0232: 
0233: //--年月日を表示

プルダウンメニューは、年(year)、月(month)、日(day)を別々のタグにする。
ここでは、日(day)の作り方のみを解説する。

ある年(year)、月(month)の日数は、「PHPで祝日を求める」で紹介したユーザー関数 getDaysInMonth を流用する。
getDaysInMonth で得られた値だけ、for ループを回し、optionタグを発生させる。
この際、引数として与えられた $day と同じ日には selected 属性を付けておく。

このプルダウンメニューが変化したら、JavaScript の onChange イベントで submit 駆動し、form 内容を送信するようにしている。これは年(year)、月(month)の場合も同様で、これを行うことで、年・月を変更した際に月の日数を計算し直すことになる。

ただし、いちいちサーバサイドで計算させることはサーバに負荷がかかるので、この処理は、本来はクライアントサイドでJavaScriptで行わせるのが良いだろう。JavaScriptによる処理については、「jQueryで年月日セレクタを用意する」をご覧いただきたい。

参考サイト

(この項おわり)
header