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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1622閲覧

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

sa-t

総合スコア4

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/01/14 14:25

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>

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanat

2021/01/14 14:38 編集

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

2021/01/14 14:40

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

回答1

0

ベストアンサー

回答

コメントありがとうございます。

php初心者でコードを真似して書きましたのであまり理解はされいません。

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

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

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

ポイントとしては、

PHP

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

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

PHP

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

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

それが理解出来たら、

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

そこまで出来たら、

  • 現在のコードで送信されている入力フォームの内容がどのようになっているかの把握
  • それを既存コードに合う様に加工する

という事をすれば、現在のフォームから年月を指定したカレンダーが表示できるようになります。

投稿2021/01/14 14:56

tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sa-t

2021/01/14 15:09

丁寧な回答ありがとうございます。 基本的には、HTMLのこの部分 <p><input type="date" name="year"></p> を変更して入力フォームを追加と言うことですか?
tanat

2021/01/14 15:14

変更しても良いのですが、 今あるフォームはそのままで、 別のところにformタグとinputタグを追加するのが理解しやすいと思います。 フォームの動きと書き方を把握できないと、今あるフォームがどのような働きをしているか理解しにくいと思います。
sa-t

2021/01/14 15:31

<form action="calendar1.php" method="get"> <p>年月日を入力</p> <p><input type="date" name="year"></p> <p><input type="text" name="year">年</p> <p><input type="text" name= "month">月</p> <p><input type="submit" name="submitBtn" value="送信"></p> </form> このような形にして入力出来るようにはしましたがここからどのようにして入力した年月が表示できるかお教えできますでしょうか?
tanat

2021/01/14 15:36

まずは回答の前半部分(「それが理解出来たら、」より前の部分)を試して、どの様なnameで値を送信する必要があるかの理解を深めて下さい。 適当なフォームで値を送信しても受け取られる事はありません。
tanat

2021/01/14 15:44

もし、そこの部分の取っ掛かりが掴めない状態であれば、先にフォーム単体の動作について学習されるのが良いかと思います。 https://www.php.net/manual/ja/tutorial.forms.php のサンプルを実際に動かして挙動をを把握したり、 `PHP フォーム` で検索すると理解の助けになります。
sa-t

2021/01/15 07:30

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

2021/01/15 08:15

フォームのnameの役割($_GETのキーとの関係性)を理解してフォームを修正すれば出来るようになります。 回答中の以下の文章のところですね。 if (isset($_GET['ym'])) { $ym = $_GET['ym']; } else { // 今月の年月を表示 $ym = date('Y-m'); } でどの様に受け取られていて、その後$ymがどのように使用されているかを追っていってください。 その際、ブラウザのURL欄に年と月が表示されているはずなので、それを直接変更してアクセスしたりして理解を深めます。
sa-t

2021/01/15 15:00 編集

issetの部分ですが自分で色々ネットで調べて、変数に値が入っているかをチェックすると言うのは分かったのですが、ここではどういう意味になっていますか? $ymについてですが、この後は前月・次月に使われていると言うことですか? ブラウザのURL欄ですが直接変更出来ました。しかし、入力して送信ボタンを押してしまうと、loclahostのURLだけで、年月は表示されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問