サンプル・プログラム
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: //--年月日を表示
ここでは、日(day)の作り方のみを解説する。

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

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

ただし、いちいちサーバサイドで計算させることはサーバに負荷がかかるので、この処理は、本来はクライアントサイドでJavaScriptで行わせるのが良いだろう。JavaScriptによる処理については、「jQueryで年月日セレクタを用意する」をご覧いただきたい。
参考サイト
- PHPで祝日を求める:ぱふぅ家のホームページ
- PHPで閏年かどうか判定する:ぱふぅ家のホームページ
- jQueryで年月日セレクタを用意する:ぱふぅ家のホームページ
(2021年4月24日)PHP8対応,リファラ・チェック改良