質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.33%

php カレンダーの作成に関して

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 603

score 1

phpでカレンダーを作成しています。
前月・翌月に移動するボタンを作成して1ヶ月後と1ヶ月前には移動できます。しかし、年月日を入力して送信ボタンに押したた年、月、日に移動できません。どうしたら良いでしょうか?

<?php
// タイムゾーンを設定
date_default_timezone_set('Asia/Tokyo');

// 前月・次月リンクが押された場合は、GETパラメーターから年月を取得
if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
} else {
    // 今月の年月を表示
    $ym = date('Y-m');
}

// タイムスタンプを作成し、フォーマットをチェックする
$timestamp = strtotime($ym . '-01');
if ($timestamp === false) {
    $ym = date('Y-m');
    $timestamp = strtotime($ym . '-01');
}

// 今日の日付 フォーマット 
$today = date('Y-m-j');

// カレンダーのタイトルを作成 
$html_title = date('Y年n月', $timestamp);

// 前月・次月の年月を取得
// strtotimeを使う
 $prev = date('Y-m', strtotime('-1 month', $timestamp));
 $next = date('Y-m', strtotime('+1 month', $timestamp));

// 該当月の日数を取得
$day_count = date('t', $timestamp);

// 1日が何曜日か 0:日 1:月 2:火 ... 6:土
$youbi = date('w', $timestamp);

// カレンダー作成の準備
$weeks = [];
$week = '';

// 第1週目:空のセルを追加
// 例)1日が水曜日だった場合、日曜日から火曜日の3つ分の空セルを追加する
$week .= str_repeat('<td></td>', $youbi);

for ( $day = 1; $day <= $day_count; $day++, $youbi++) {

    $date = $ym . '-' . $day;

    if ($today == $date) {
        // 今日の日付の場合は、class="today"をつける
        $week .= '<td class="today">' . $day;
    } else {
        $week .= '<td>' . $day;
    }
    $week .= '</td>';

    // 週終わり、または、月終わりの場合
    if ($youbi % 7 == 6 || $day == $day_count) {

        if ($day == $day_count) {
            // 月の最終日の場合、空セルを追加
            // 例 最終日が木曜日の場合、金・土曜日の空セルを追加
            $week .= str_repeat('<td></td>', 6 - ($youbi % 7));
        }

        // weeks配列にtrと$weekを追加する
        $weeks[] = '<tr>' . $week . '</tr>';

        // weekをリセット
        $week = '';
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>PHPカレンダー</title>

    <body>
  <form action="calendar1.php" method="get">

    <p>年月日を入力</p>
    <p><input type="date" name="year"></p>
    <p><input type="submit" name="submitBtn" value="送信"></p>    

       <?php
        $year=$_POST["year"];
        $month=$_POST["month"];
       ?>

  </form>
</body>

    <style>
        .container {
            font-family: 'Noto Sans JP', sans-serif;
            margin-top: 10px;
        }
        h4 {
            margin-bottom: 50px;
        }
        th {
            height: 20px;
            text-align: center;
        }
        td {
            height: 20px;
        }
        .today {
            background: pink;
        }
        th:nth-of-type(1), td:nth-of-type(1) {
            color: red;
        }
        th:nth-of-type(7), td:nth-of-type(7) {
            color: blue;
        }
    </style>
</head>
<body>
    <div class="container">
        <h3><a href="?ym=<?php echo $prev; ?>">&lt;</a> 
        <?php echo $html_title; ?> 
        <a href="?ym=<?php echo $next; ?>">&gt;</a></h3>

        <table class="table table-bordered">
            <tr>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
            <?php
                foreach ($weeks as $week) {
                    echo $week;
                }
            ?>
        </table>
    </div>
</body>
</html>


イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tanat

    2021/01/14 23:38 編集

    現在のコード(年月日指定以外の部分)は全て理解されていますか?

    キャンセル

  • sa-t

    2021/01/14 23:40

    コメントありがとうございます。
    php初心者でコードを真似して書きましたのであまり理解はされいません。

    キャンセル

回答 1

checkベストアンサー

+4

回答

コメントありがとうございます。
php初心者でコードを真似して書きましたのであまり理解はされいません。

と言う事であれば、まずは現状のコードを1行ずつ理解して行って、不明な点を質問されるのが良いかと思います。
現状の機能を理解していないのに機能を追加するのは無理です

そのためには、PHP デバッグ方法php xdebug VSCode等で検索し、デバッグできる環境を用意するのが近道です。

現状のコード理解のポイント

ポイントとしては、

        <a href="?ym=<?php echo $next; ?>">&gt;</a></h3>


ここで表示しているリンクが実際にどの様なHTMLになっているかをブラウザで確認し、
パラメータを受け取っている

if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
} else {
    // 今月の年月を表示
    $ym = date('Y-m');
}

でどの様に受け取られていて、その後$ymがどのように使用されているかを追っていってください。
その際、ブラウザのURL欄に年と月が表示されているはずなので、それを直接変更してアクセスしたりして理解を深めます。

それが理解出来たら、

(現状使っている様な入力フォームでカレンダーを表示するのではなく)
年月だけを手動入力するフォームを作って、狙った年月のカレンダーを表示する
と言う機能を追加してみることをお勧めします。
(フォームを追加するだけで出来ます)

そこまで出来たら、

  • 現在のコードで送信されている入力フォームの内容がどのようになっているかの把握
  • それを既存コードに合う様に加工する
    という事をすれば、現在のフォームから年月を指定したカレンダーが表示できるようになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/15 16:30

    フォーム単体で動かして、入力した値だけを表示することはできました。
    ここからカレンダーの部分も、入力した値で変わってきますか?

    キャンセル

  • 2021/01/15 17:15

    フォームのnameの役割($_GETのキーとの関係性)を理解してフォームを修正すれば出来るようになります。



    回答中の以下の文章のところですね。

    if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
    } else {
    // 今月の年月を表示
    $ym = date('Y-m');
    }
    でどの様に受け取られていて、その後$ymがどのように使用されているかを追っていってください。
    その際、ブラウザのURL欄に年と月が表示されているはずなので、それを直接変更してアクセスしたりして理解を深めます。

    キャンセル

  • 2021/01/15 17:28 編集

    issetの部分ですが自分で色々ネットで調べて、変数に値が入っているかをチェックすると言うのは分かったのですが、ここではどういう意味になっていますか?

    $ymについてですが、この後は前月・次月に使われていると言うことですか?
    ブラウザのURL欄ですが直接変更出来ました。しかし、入力して送信ボタンを押してしまうと、loclahostのURLだけで、年月は表示されませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る