こんにちは。
php初学者です。
今回”2020-12-03”というような文字列を登録日としてDBのカラム(varchara)に用意しているで状態で、
スタート日とエンド日をプルダウン選択式にしユーザーに選択させ、
最終的にはスタート日の年、月、日。エンド日の年、月、日を検索buttonでPOSTし、期間内かの判定をなんとか行い、期間内であれば表示。
を行いたいと考えています。
見た目としては
【2020 年 12 月 3 日】 ~ 【2020 年 12 月 3 日】(※数字部分はプルダウンをご想像頂けばと思います。)
以下、それぞれのブックを
【左】~【右】と表現させて頂きます
下記はスタート日(【左】) の中身をネットで検索したものです。
(消してしまっていいのか不明な記述が幾つか残ってしまっているではありますが、一旦期待した通りに動いています。)
ご回答頂ける方は一目してお判りになるかと思いますが、
選択された月に応じた月末日と、選択された年に応じて閏年の有無を判定し、
ON CHANGEでリダイレクト(※用語の使い方を間違えていたらすみません。)され反映される仕様になっているものと捉えています。
これを同ページ上に【右】として仮にコピーをして、全ての変数名等を【左】のものと別になるよう書き換えた所、
見た目は期待通りになり、それぞれのブロックとしては月末日判定も閏年判定も問題なく動くようになったのですが、
当然、【左】の値を変更すると【右】はリダイレクトされ【2020 年 12 月 3 日】に戻ってしまい、
反対に【右】の値を変更すると【左】はリダイレクトされ【2020 年 12 月 3 日】に戻ってしまう状況です。
$_SESSION['']に都度6つの値を格納して反映させようと長時間格闘したのですが、上手く動きません。
お判りになる方お知恵をお貸し頂けると幸いです。
<?php // 初期化処理 ================================================================ $InternalEncoding = 'UTF-8'; mb_internal_encoding($InternalEncoding); $MySelf = basename($_SERVER['SCRIPT_NAME']); /** * 共通HTMLヘッダ * @global string $HtmlHeader */ $HtmlHeader =<<< EOD EOD; /** * 共通HTMLフッタ * @global string $HtmlFooter */ $HtmlFooter =<<< EOD EOD; // サブルーチン ============================================================== /** * 閏年かどうか判定する * @param int $year 西暦年 * @return bool TRUE:閏年である/FALSE:平年である */ function isleap($year) { $ret = FALSE; if ($year % 4 == 0) $ret = TRUE; if ($year % 100 == 0) $ret = FALSE; if ($year % 400 == 0) $ret = TRUE; return $ret; } /** * 指定した月の日数を返す * @param int $year 西暦年 * @param int $month 月 * @return int 日数/FALSE:引数の異常 */ function getDaysInMonth($year, $month) { static $days = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if ($month < 1 || $month > 12) return FALSE; $days[2] = isleap($year) ? 29 : 28; //閏年の判定 return $days[$month]; } /** * HTML BODYを作成する * @param bool $mode TRUE=プルダウン/FALSE=表示 * @param int $year,$month,$day 年,月,日 * @return string HTML BODY */ function makeCommonBody($mode, $year, $month, $day) { global $MySelf; $outstr = ''; //--プルダウンメニュー if ($mode) { $name = 'exec'; //--年 $outstr .=<<< EOD <select name="year" onChange="submit();"> EOD; for ($y = 2020; $y <= $year; $y++) { $selected = ($y == $year) ? 'selected' : ''; $outstr .=<<< EOD <option value="{$y}" {$selected}>{$y}</option> EOD; } $outstr .=<<< EOD </select>年 EOD; //--月 $outstr .=<<< EOD <select name="month" onChange="submit();"> EOD; for ($m = 1; $m <= 12; $m++) { $selected = ($m == $month) ? 'selected' : ''; $outstr .=<<< EOD <option value="{$m}" {$selected}>{$m}</option> EOD; } $outstr .=<<< EOD </select>月 EOD; //--日 $dd = getDaysInMonth($year, $month); $outstr .=<<< EOD <select name="day" onChange="submit();"> EOD; for ($d = 1; $d <= $dd; $d++) { $selected = ($d == $day) ? 'selected' : ''; $outstr .=<<< EOD <option value="{$d}" {$selected}>{$d}</option> EOD; } $outstr .=<<< EOD </select>日 EOD; //--年月日を表示 } else { $name = 'display'; $outstr .=<<< EOD {$year}-{$month}-{$day} <input type="hidden" name="year" value="{$year}" /> <input type="hidden" name="month" value="{$month}" /> <input type="hidden" name="day" value="{$day}" /> EOD; } //--月が1以上9以下だった場合、検索値の先頭に0をつける。 if($month >=1 && $month <=9 ) { $month = "0".$month; } //--日が1以上9以下だった場合、検索値の先頭に0をつける。 if($day >=1 && $day <=9 ) { $day = "0".$day; } $body =<<< EOD <h3>▼登録年月日を選択してください</h3> <form name="MyForm" method="POST" action="$MySelf"> {$outstr} </form> <form name="MyForm" method="POST" action="user_r_date_search.php"> <input type="hidden" name="r_date" value="{$year}-{$month}-{$day}"> <input type="submit" class="btn btn-success" value="検索"> </form> EOD; return $body; } // メイン・プログラム ====================================================== $mode = ! isset($_POST['exec']); //プルダウン or 表示 $year = isset($_POST['year']) ? $_POST['year'] : (int)date('Y'); $month = isset($_POST['month']) ? $_POST['month'] : (int)date('m'); $day = isset($_POST['day']) ? $_POST['day'] : (int)date('d'); $HtmlBody = makeCommonBody($mode, $year, $month, $day); // 表示処理 echo $HtmlHeader; echo $HtmlBody; echo $HtmlFooter; ?>
あなたの回答
tips
プレビュー