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

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

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

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

Q&A

解決済

3回答

530閲覧

PHPでカレンダーを作成しているのですが・・・

P_Beginner

総合スコア99

PHP

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

0グッド

0クリップ

投稿2018/04/19 12:34

前回の質問ではたくさんの回答者さんによる回答ありがとうございます。
その時のプログラムと大して変わらないとは思いますが、表示する日付をプルダウンメニューにより指定し、表示ボタンを押すことで表示できるようにしたいのですが・・・。

(1) (日数を考慮した部分を除外)動作が不安定であるので、どの部分がどうおかしいのか見てほしい。
(2) 指定した月の日数の記述方法がわからず、if文でやってみたがうまくいかない。うるう年も考慮されない。
(3) プルダウンメニューの[年]をfor文で入れたいが方法がわからない。

この3点について、可能であればアドバイスをいただきたいと思っています。回答よろしくお願いします。

PHP

1 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="utf-8"> 6 <title>カレンダー</title> 7</head> 8<body> 9 <form method="get" action="3.php"> 10 <select name="year"> 11 <option value="2018">2018</option> 12 <option value="2019">2019</option> 13 <option value="2020">2020</option> 14 </select>15 <select name="month"> 16 <option value="1">1</option> 17 <option value="2">2</option> 18 <option value="3">3</option> 19 <option value="4">4</option> 20 <option value="5">5</option> 21 <option value="6">6</option> 22 <option value="7">7</option> 23 <option value="8">8</option> 24 <option value="9">9</option> 25 <option value="10">10</option> 26 <option value="11">11</option> 27 <option value="12">12</option> 28 </select>29 <input type="submit" value="表示"> 30 </form> 31 <?php 32 ini_set('display_errors',1); //エラー表示 33 34 $year=$_GET['year']; 35 $month=$_GET['month']; 36 $day=0; 37 $w=date("w"); 38 if($month==2){ 39 if(($year%4==0&&$year%100!=0)||$year%400)) $lastday=29; 40 else $lastday=28; 41 } 42 else if($month==4||$month==6||$month==9||$month==11) $lastday=30; 43 else $lastday=31; 44 45 46 $wkanji[0]="日"; 47 $wkanji[1]="月"; 48 $wkanji[2]="火"; 49 $wkanji[3]="水"; 50 $wkanji[4]="木"; 51 $wkanji[5]="金"; 52 $wkanji[6]="土"; 53 54 echo "<br>{$year}{$month}月<br><br>"; 55 for($d=1;$d<=$lastday;$d++){ 56 $w=date("w",mktime(0,0,0,$month,$d,$year)); 57 $youbi=$wkanji[$w]; 58 $dd=$d."日(".$youbi.")"; 59 if($w==0) $dd="<span style='color:red'>{$dd}</span>"; 60 if($w==6) $dd="<span style='color:blue'>{$dd}</span>"; 61 echo "{$dd}<br>"; 62 } 63 ?> 64 65</body> 66</html>

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

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

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

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

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

kszk311

2018/04/19 15:02 編集

まずは記法を、コロンかカッコどちらかに統一しては?あと、カッコの終わりと始まりがあってないので、見直してください
guest

回答3

0

php

1<?php 2 3$option_year_list = range(2018, 2021); 4$option_month_list = range(1, 12); 5if($_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_GET['show_submit'])) { 6 $choosed_year = (int)$_GET['year']; 7 $choosed_month = (int)$_GET['month']; 8} 9 10function h($str) { 11 return htmlspecialchars($str); 12} 13?> 14 15<!DOCTYPE html> 16<html lang="ja"> 17<head> 18 <meta charset="utf-8"> 19 <title>カレンダー</title> 20</head> 21<body> 22 <form method="get" action="3.php"> 23 <select name="year"> 24 <?php foreach ($option_year_list as $option_year): ?> 25 <option value="<?=h($option_year)?>" <?php if(!empty($choosed_year) && ($option_year === $choosed_year)) echo('selected="selected"'); ?>> 26 <?=h($option_year)?> 27 </option> 28 <?php endforeach; ?> 29 </select>30 <select name="month"> 31 <?php foreach ($option_month_list as $option_month): ?> 32 <option value="<?=h($option_month)?>" <?php if(!empty($choosed_month) && ($option_month === $choosed_month)) echo('selected="selected"'); ?>> 33 <?=h($option_month)?> 34 </option> 35 <?php endforeach; ?> 36 </select>37 <input type="submit" name="show_submit" value="表示"> 38 </form> 39 <?php 40 ini_set('display_errors',1); //エラー表示 41 if($_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_GET)) { 42 $year=$_GET['year']; 43 $month=$_GET['month']; 44 $day=0; 45 $w=date("w"); 46 if($month==2){ 47 if((($year % 4 === 0) && ($year % 100 !== 0)) || ($year % 400 === 0)) { 48 $lastday=29; 49 } else { 50 $lastday=28; 51 } 52 } 53 else if($month==4||$month==6||$month==9||$month==11) { 54 $lastday=30; 55 } else { 56 $lastday=31; 57 } 58 59 $wkanji[0]="日"; 60 $wkanji[1]="月"; 61 $wkanji[2]="火"; 62 $wkanji[3]="水"; 63 $wkanji[4]="木"; 64 $wkanji[5]="金"; 65 $wkanji[6]="土"; 66 67 echo "<br>{$year}{$month}月<br><br>"; 68 for($d=1;$d<=$lastday;$d++){ 69 $w=date("w",mktime(0,0,0,$month,$d,$year)); 70 $youbi=$wkanji[$w]; 71 $dd=$d."日(".$youbi.")"; 72 if($w==0) $dd="<span style='color:red'>{$dd}</span>"; 73 if($w==6) $dd="<span style='color:blue'>{$dd}</span>"; 74 echo "{$dd}<br>"; 75 } 76 } 77 ?> 78 79</body> 80</html>

>>(1) (日数を考慮した部分を除外)動作が不安定であるので、どの部分がどうおかしいのか見てほしい。
うるう年判定の部分で構文エラーが出てました。
自動構文チェック機能付きのエディターを使えば、解決すると思います。
おすすめは、vsc(visual studio code)です!

>>(2) 指定した月の日数の記述方法がわからず、if文でやってみたがうまくいかない。うるう年も考慮されない。
これは(1)と同じ問題だと思いますので、(1)を解決すれば、いいと思います。

>>(3) プルダウンメニューの[年]をfor文で入れたいが方法がわからない。
私が書いたサンプルコードでは、foreachを使用しました。
phpはhtmlに埋め込めるので、
埋め込み方を知れば、解決すると思います。
https://www.flatflag.nir87.com/for-273

サンプルコードでは、短く書ける書き方を使用しています。

php

1<?php echo('hello!'); ?> 2<?='hello'?>//上と動きは、同じです。echo短縮の書き方です。

php

1<?php foreach($sample_arr as $sample_val) { ?> 2<?=$sample_val?> 3<?php } ?> 4//上のコードは、下のようにも書くことが出来ます。 5<?php foreach($sample_arr as $sample_val): ?> 6<?=$sample_val?> 7<?php endforeach; ?>

サンプルコード内で、
h()で囲んである部分がありますが、
phpをhtmlに出力する際は、いつも囲む必要があるようです。

後、$_GETや$_POSTを利用する際は、!emptyで確認してから、
処理しないと、初回読み込み時にエラーが出ます。

後、表示ボタンを押すと、年月の数字が戻ってしまうようになっていたので、
入力数字を維持するようにしてあります。見てみてください。

投稿2018/04/19 14:55

編集2018/04/20 17:47
fjaiofjawiefjaw

総合スコア210

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

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

m.ts10806

2018/04/19 21:47 編集

emptyより前にREQUEST_METHODで確認した方がより良いですね。
fjaiofjawiefjaw

2018/04/20 17:48

ご助言ありがとうございます。 $_SERVER['REQUEST_METHOD']ですね。 お恥ずかしながら、存じ上げておりませんでした。 コード修正させて頂きました。
guest

0

ベストアンサー

こんな感じですかね

PHP

1<?php 2$year=filter_input(INPUT_GET,'year')?:date('Y'); 3$month=filter_input(INPUT_GET,'month')?:date('n'); 4?> 5<form method="get"> 6<select name="year"> 7<?php 8for($i=2018;$i<=2020;$i++){ 9 $selected=$i==$year?" selected":""; 10 print "<option value=\"{$i}\"{$selected}>{$i}</option>\n"; 11} 12?> 13</select>14<select name="month"> 15<?php 16for($i=1;$i<=12;$i++){ 17 $selected=$i==$month?" selected":""; 18 print "<option value=\"{$i}\"{$selected}>{$i}</option>\n"; 19} 20?> 21</select>22<input type="submit" value="表示"> 23</form> 24<?php 25$lastday=date('d',mktime(0,0,0,$month+1,0,$year)); 26$wkanji=["日","月","火","水","木","金","土"]; 27echo "<br>{$year}{$month}月<br><br>"; 28for($d=1;$d<=$lastday;$d++){ 29 $w=date("w",mktime(0,0,0,$month,$d,$year)); 30 $youbi=$wkanji[$w]; 31 $dd=$d."日(".$youbi.")"; 32 if($w==0) $dd="<span style='color:red'>{$dd}</span>"; 33 if($w==6) $dd="<span style='color:blue'>{$dd}</span>"; 34 echo "{$dd}<br>"; 35} 36?> 37 38

投稿2018/04/20 03:14

yambejp

総合スコア114572

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

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

0

日付関連は自分で計算しないでstrtotimeなど日付関連の関数に任せましょう。

投稿2018/04/19 22:53

tekka

総合スコア514

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問