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

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

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

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

Q&A

解決済

1回答

2666閲覧

カレンダーの前月、次月ボタンを作成したいです。

amaturePy

総合スコア131

PHP

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

0グッド

1クリップ

投稿2019/05/10 08:02

編集2019/05/11 00:51

PHPでカレンダーの作成をしております。
その中で次月、前月のようなボタンを押すとそのカレンダーの情報に移るようプログラムを組みたいです。
ループ処理により年間分のカレンダー情報を表示と考えているのですが、そのような仕組みを作った機械がなく、
調べては見たのですが、なかなか機能しないため、お力をお借りしたく質問させて頂いてます。

PHP

1<!DOCTYPE html> 2<html> 3 <head> 4 <title>Kento Calendar</title> 5 </head> 6 7 <body> 8 9<?php 10$now_year = date("Y"); 11$now_month = date("m"); 12$now_day = date("j"); 13$weekday = array( "Sunday", "Monday", "Thuseday", "Wednesday", "Thursday", "Friday", "Saturday" ); 14 15$fir_weekday = date( "w", mktime( 0, 0, 0, $now_month, 1 , $now_year ) ); 16///////////////////////////////////setting valuable 17echo '<table border="1" cellspacing="0" cellpadding="0" style="text-align:center;">'; 18// 見出し部分<caption>タグ出力 19echo "<caption style=\"color:black; font-size:14px; padding:0px;\">" 20.$now_month."/".$now_year." 21 </caption>\n";////////////////////////caption 22 23echo "<tr>\n"; 24 25$i = 0; // カウント値リセット 26while( $i <= 6 ){ // 曜日分ループ 27 28/////////////////////////////////////style sheet 29 if( $i == 0 ){ // 日曜日の文字色 30 $style = "#C30"; 31 } 32 else if( $i == 6 ){ // 土曜日の文字色 33 $style = "#03C"; 34 } 35 else{ // 月曜~金曜日の文字色 36 $style = "black"; 37 } 38 echo "\t<th style=\"color:".$style."\">".$weekday[$i]."</th>\n"; 39 $i ++; //カウント値+1 40} 41/////////////////////////////////////end of style sheet 42// 行の変更 43echo "</tr>\n"; 44echo "<tr>\n"; 45 46$i = 0; 47while( $i != $fir_weekday ){ 48 echo "\t<td>&nbsp;</td>\n"; 49 $i ++; 50} 51 52// 今月の日付が存在している間ループする 53for( $day=1; checkdate( $now_month, $day, $now_year ); $day++ ){ 54 55 //曜日の最後まできたらカウント値(曜日カウンター)を戻して行を変える 56 if( $i > 6 ){ 57 $i = 0; 58 echo "</tr>\n"; 59 echo "<tr>\n"; 60 } 61 62///////////////////////////////////////style sheet 63 if( $i == 0 ){///the color of sunday 64 $style = "#C30"; 65 66} else if( $i == 6 ){ //the color of saturday 67 $style = "#03C"; 68 69} else { //the color of monday to friday 70 $style = "black"; 71 } 72 73 // if it is today , it gets color 74 if( $day == $now_day ){ 75 $style = $style."; background:silver"; 76 } 77//////////////////////////////////////end of style sheet 78 79 // 日付セル作成とスタイルシートの挿入 80 echo "\t<td style=\"color:".$style.";\">".$day."</td>\n"; 81 82 $i++; //カウント値(曜日カウンター)+1 83} 84 85while( $i < 7 ){ //残りの曜日分空白(&nbsp;)で埋める 86 echo "\t<td>&nbsp;</td>\n"; 87 $i++; 88} 89echo "</tr>\n"; 90echo "</table>\n"; 91 92///////////////////////////////////////////////////////previous and next month 93?> 94 95<?php 96 $ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym"); 97 98 $lastmonth = date("Ym",strtotime($ym."01"." -1 month ")); 99 $nextmonth = date("Ym",strtotime($ym."01"." +1 month ")); 100 101 echo '<a href="ex5-2.php?ym='.$lastmonth.'">Last month</a>'; 102 echo "<br>"; 103 echo '<a href="ex5-2.php?ym='.$nextmonth.'">Next month</a>'; 104 105 $this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得。 106 ?> 107 108</body> 109</html> 110

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

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

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

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

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

m.ts10806

2019/05/10 08:06

コードブロックは囲ったらできます(難しければコード部分のみ選択して<code>ボタンを押すと良い) ``` ここにコードのみ投稿 ```
amaturePy

2019/05/11 00:39

申し訳ありません。 コード内に入れたつもりだったのですが、入ってないですね。 再度編集いたします。
m.ts10806

2019/05/11 00:41

PCであれば投稿画面右側にプレビューが出てるので確認して調整すると良いです
amaturePy

2019/05/11 00:42

承知いたしました。 今ほど修正いたしました。
m.ts10806

2019/05/11 00:48

ちょっと細かくて申し訳ないですが「コード」 という文字は実際のコードにはないでしょうしDOCTYPE宣言の冒頭の<が切れてますね…
amaturePy

2019/05/11 00:55

大変失礼いたしました。ただいま修正いたしました! また、ご回答ありがとうございます! とても参考になります。 そこで試したところ、月変更ボタンを押すと別ファイルに移動するような作りかと認識しているのですが、 年間分プログラムでカレンダーを表示したいです。 私の認識違いでしたらご指摘頂けると幸いです。 元々の私の質問内容に詳細がかけており大変申し訳ありません。
m.ts10806

2019/05/11 00:56

回答の方にコメントつけていただければと。
guest

回答1

0

ベストアンサー

GETでyear,month渡して、渡されてなかったら当月、渡されてたらその月、、、という風にして
あとはそのyear,monthの前月次月をdate()の第2引数で計算すれば良いです。

php

1<?php 2$ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym"); 3 4$lastmonth = date("Ym",strtotime($ym."01"." -1 month ")); 5$nextmonth = date("Ym",strtotime($ym."01"." +1 month ")); 6 7echo '<a href="index.php?ym='.$lastmonth.'">前月</a>'; 8echo '<a href="index.php?ym='.$nextmonth.'">次月</a>'; 9 10$this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得。 11

※私はmktimeよりstrtotimeをよく採用しているのでこの書き方です。

そこで試したところ、月変更ボタンを押すと別ファイルに移動するような作りかと認識しているのですが、

説明省いてしまっていましたがindex.phpとしたのは仮で、実際はカレンダーを表示させているプログラムと同じファイル名・URLを指定してください。大事なのはGETで年月のパラメータを渡すことなので。

年間分プログラムでカレンダーを表示したいです。

「1ページに指定の年の全ての月のカレンダーを表示したい」ということでしたら考え方は同じです。
パラメータが年月になるかになるかの違いです。
それぞれの年月によって日数は異なりますが、何年であっても月は1から12までしかないので、
forで1~12を回してパラメータのyと結合して年月としたらあとは同じです。
多少レイアウトにはよりますが、1~12まで加算していくforループの中に1~その年月の日数分まで加算していくforループが入る形です。

投稿2019/05/10 08:14

編集2019/05/11 01:01
m.ts10806

総合スコア80850

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

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

m.ts10806

2019/05/10 08:16

今回は対応入れてませんが、GETだと不正な値を与えることも可能なので、「日付として正しい形式かどうか」のチェックはどこかのタイミングで入れる必要があります。
退会済みユーザー

退会済みユーザー

2019/05/10 08:44

日付とか曜日とかの管理、素直にDateTimeクラスとか使えば楽そうなのに。 1日ずつ曜日カウンターの増やしていく感じよりも、 日付を直接加算して、日付から曜日を求める方が間違いが生じにくそう。 (直接の回答ではないので、コメントにて失礼。)
m.ts10806

2019/05/10 08:52

やり方はたくさんありますね。 ひとまず「オーソドックスなやり方」として提案してみました。 これから祝日表示とか色々入ってくるとなるとかなり煩雑化してくるので、 そこはうまいことやってもらうとして・・
amaturePy

2019/05/11 01:06

承知いたしました。 別でカレンダーを表示させるプログラムを用意する必要があるのですね。 勉強になります。 再度、作成してみます。
m.ts10806

2019/05/11 01:23

いや、そういうことではないですよ。 ちなみに 「次月、前月のようなボタンを押すとそのカレンダーの情報に移るようプログラム」と 「ループ処理により年間分のカレンダー情報を表示」は考え方が全く別です。 私の最初の回答は「月のカレンダーを表示したうえで次月前月対応」で 後半の回答は「年間カレンダー」です。 もし「年間カレンダーを1ページに表示して次月前月ボタンを押すと」となるとゴチャゴチャになります。それなら1ページに表示されるのは月のカレンダーだけのほうが良いです。 まあ、Ajaxでも使えば画面遷移なしに「月のカレンダーだけ切り替える」のは可能ですが。 もう少し図などで要件をまとめられたほうが良いかと思います。 文章とコードだけでは限界があるので。
amaturePy

2019/05/11 02:14

ありがとうございます。 私の理想としては最初にあげて頂いた回答の方になります。 ボタンを押すと順々に前月または次月を閲覧できるようにするものです。
m.ts10806

2019/05/11 02:33

では月の日数取得は書いたので、あとはforで日数分回すだけですね。 (たぶん元のロジックに私のコードを入れ込もうと思うとごちゃごちゃになるので作り直したほうが良いです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問