前提・実現したいこと
予定表機能付きカレンダーに先月・次月ボタンを実装したいです
phpやhtml初心者でどこに問題が生じているかわからず、質問させて頂きました。
実装したい機能の部分に注釈(//追加したい箇所)をつけておきます
発生している問題・エラーメッセージ
先月、次月ボタンを押しても今月基準で前後一か月しか移動できない
該当のソースコード
Reminder.php
php
1<html> 2<head> 3<link rel="stylesheet" type="text/css" href="style.css" /> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5<title>予定表</title> 6</head> 7<body> 8<h1>予定表</h1> 9<p>予定を登録する日を選択してください。</p> 10<?php 11 12//追加したい箇所1か所目 ここから 13 14if (isset($_POST["y"])) { 15 // 選択された年月を取得する 16 $y = intval($_POST["y"]); 17 $m = intval($_POST["m"]); 18} else { 19 // 現在の年月を取得する 20 $ym_now = date("Ym"); 21 $y = substr($ym_now, 0, 4); 22 $m = substr($ym_now, 4, 2); 23}; 24 25if (isset($_POST['last'])){ 26 //"先月"ボタンを押した際mの数値を-1する 27 $m = $m-1; 28 if($m == 0){ 29 $y--; 30 $m = 12; 31 } 32}; 33 34//ここまで 35 36if (isset($_POST['next'])){ 37 //"次月"ボタンを押した際mの数値を+1する 38 $m = $m+1; 39 if($m == 13){ 40 $y++; 41 $m = 1; 42 } 43}; 44 45// 年月選択リストを表示する 46echo "<form method='POST' action=''>"; 47 48// 年 49echo "<select name='y'>"; 50for ($i = $y - 2; $i <= $y + 2; $i++) { 51 echo "<option"; 52 if ($i == $y) { 53 echo " selected "; 54 } 55 echo ">$i</option>"; 56} 57echo "</select>年"; 58 59// 月 60echo "<select name='m'>"; 61for ($i = 1; $i <= 12; $i++) { 62 echo "<option"; 63 if ($i == $m) { 64 echo " selected "; 65 } 66 echo ">$i</option>"; 67} 68echo "</select>月"; 69echo "<input id='month' type='submit' value='表示' name='sub1' onchange = 'MonthGet()'>"; 70echo "</form>"; 71?> 72 73<!-- カレンダーの表示 --> 74<table border="2" style="border-collapse: collapse" width="300" height="150"> 75<!-- 月の表示 --> 76 77//追加したい箇所2か所目 ここから 78 79 <caption align="top"> 80 <form action="Reminder.php" method="post"> 81 <button imput id='month' type='submit' name='last'>先月</button> 82 </form> 83 <font size="6"> 84 <?php 85 echo $m; echo"月"; 86 ?> 87 </font> 88 <form action="Reminder.php" method="post"> 89 <button imput id='month' type='submit' name='next'>次月</button> 90 </form> 91 </caption> 92 93//ここまで 94 95<tr> 96<th style="color:magenta">日</th> 97<th>月</th> 98<th>火</th> 99<th>水</th> 100<th>木</th> 101<th>金</th> 102<th style="color:cyan">土</th> 103</tr> 104<tr> 105<?php 106// 1日の曜日まで移動 107$wd1 = date("w", mktime(0, 0, 0, $m, 1, $y)); 108for ($i = 1; $i <= $wd1; $i++) { 109 echo "<td align=\"center\" valign=\"top\"> </td>"; 110} 111 112$d = 1; 113while (checkdate($m, $d, $y)) { 114 // 日付リンクの表示 115 $link = "schedule.php?ymd=%04d%02d%02d"; 116 echo "<td align=\"center\" valign=\"top\"><a href=\"" . sprintf($link, $y, $m, $d) . "\">{$d}</a></td>"; 117 118 // 今日が土曜日の場合の処理 119 if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6) { 120 // 週を終了 121 echo "</tr>"; 122 123 // 次の週がある場合は新たな行を準備 124 if (checkdate($m, $d + 1, $y)) { 125 echo "<tr>"; 126 } 127 } 128 129 // 日付を1つ進める 130 $d++; 131} 132 133// 最後の週の土曜日まで移動 134$wdx = date("w", mktime(0, 0, 0, $m + 1, 0, $y)); 135for ($i = 1; $i < 7 - $wdx; $i++) { 136 echo "<td> </td>"; 137} 138?> 139</tr> 140</table> 141</body> 142</html>
schedule.php (スケジュールを登録するためのphpです。問題の箇所とは無関係です)
<?php // 年月日を取得する if (isset($_GET["ymd"])) { // スケジュールの年月日を取得する $ymd = basename($_GET["ymd"]); $y = intval(substr($ymd, 0, 4)); $m = intval(substr($ymd, 4, 2)); $d = intval(substr($ymd, 6, 2)); $disp_ymd = "{$y}年{$m}月{$d}日のスケジュール"; // スケジュールデータを取得する $file_name = "data/{$ymd}.txt"; if (file_exists($file_name)) { $schedule = file_get_contents($file_name); } else { $schedule = ""; } } else { // カレンダー画面に強制移動する header("Location: Reminder.php"); } // スケジュールを更新する if (isset($_POST["action"]) and $_POST["action"] == "登録する") { $schedule = htmlspecialchars($_POST["schedule"], ENT_QUOTES, "UTF-8"); // スケジュールが入力されたか調べて処理を分岐 if (!empty($schedule)) { // 入力された内容でスケジュールを更新 file_put_contents($file_name, $schedule); } else { // スケジュールが空の場合はファイルを削除 if (file_exists($file_name)) { unlink($file_name); } } // カレンダー画面に移動する header("Location: Reminder.php"); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>予定表</title> </head> <body> <h1>予定表 登録画面</h1> <form method="POST" action=""> <table> <tr> <td><?php echo $disp_ymd; ?></td> </tr> <tr> <td> <textarea rows="10" cols="50" name="schedule"><?php echo $schedule; ?></textarea> </td> </tr> <tr> <td> <input type="submit" name="action" value="登録する"> <!-- 「戻る」ボタン --> <input type="button" name="back" onClick="history.back()" value="戻る"> </td> </tr> </table> </form> </body> </html>
試したこと
先月ボタンを押したとき月の数値($m)をマイナス1するなどためしましたが、うまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Visual studio code
バージョンは現時点の最新です