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

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

ただいまの
回答率

90.49%

  • PHP

    20771questions

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

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

解決済

回答 3

投稿

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

P_Beginner

score 14

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

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

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

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>カレンダー</title>
</head>
<body>
    <form method="get" action="3.php">
        <select name="year">
            <option value="2018">2018</option>
            <option value="2019">2019</option>
            <option value="2020">2020</option>
        </select>年
        <select name="month">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
            <option value="7">7</option>
            <option value="8">8</option>
            <option value="9">9</option>
            <option value="10">10</option>
            <option value="11">11</option>
            <option value="12">12</option>
        </select>月
        <input type="submit" value="表示">
    </form>
    <?php
        ini_set('display_errors',1);    //エラー表示

        $year=$_GET['year'];
        $month=$_GET['month'];
        $day=0;
        $w=date("w");
        if($month==2){
            if(($year%4==0&&$year%100!=0)||$year%400)) $lastday=29;
            else $lastday=28;
        }
        else if($month==4||$month==6||$month==9||$month==11) $lastday=30;
        else $lastday=31;


        $wkanji[0]="日";
        $wkanji[1]="月";
        $wkanji[2]="火";
        $wkanji[3]="水";
        $wkanji[4]="木";
        $wkanji[5]="金";
        $wkanji[6]="土";

        echo "<br>{$year}年{$month}月<br><br>";
        for($d=1;$d<=$lastday;$d++){
            $w=date("w",mktime(0,0,0,$month,$d,$year));
            $youbi=$wkanji[$w];
            $dd=$d."日(".$youbi.")";
            if($w==0) $dd="<span style='color:red'>{$dd}</span>";
            if($w==6) $dd="<span style='color:blue'>{$dd}</span>";
            echo "{$dd}<br>";
        }
    ?>

</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kszk311

    2018/04/20 00:02 編集

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

    キャンセル

回答 3

+1

<?php

$option_year_list = range(2018, 2021);
$option_month_list = range(1, 12);
if($_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_GET['show_submit'])) {
  $choosed_year = (int)$_GET['year'];
  $choosed_month = (int)$_GET['month'];
}

function h($str) {
  return htmlspecialchars($str);
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>カレンダー</title>
</head>
<body>
    <form method="get" action="3.php">
        <select name="year">
          <?php foreach ($option_year_list as $option_year): ?>
            <option value="<?=h($option_year)?>" <?php if(!empty($choosed_year) && ($option_year === $choosed_year)) echo('selected="selected"'); ?>>
              <?=h($option_year)?>
            </option>
          <?php endforeach; ?>
        </select>年
        <select name="month">
          <?php foreach ($option_month_list as $option_month): ?>
          <option value="<?=h($option_month)?>" <?php if(!empty($choosed_month) && ($option_month === $choosed_month)) echo('selected="selected"'); ?>>
            <?=h($option_month)?>
          </option>
          <?php endforeach; ?>
        </select>月
        <input type="submit" name="show_submit" value="表示">
    </form>
    <?php
      ini_set('display_errors',1);    //エラー表示
      if($_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_GET)) {
        $year=$_GET['year'];
        $month=$_GET['month'];
        $day=0;
        $w=date("w");
        if($month==2){
          if((($year % 4 === 0) && ($year % 100 !== 0)) || ($year % 400 === 0)) {
            $lastday=29;
          } else {
            $lastday=28;
          }
        }
        else if($month==4||$month==6||$month==9||$month==11) {
          $lastday=30;
        } else {
          $lastday=31;
        }

        $wkanji[0]="日";
        $wkanji[1]="月";
        $wkanji[2]="火";
        $wkanji[3]="水";
        $wkanji[4]="木";
        $wkanji[5]="金";
        $wkanji[6]="土";

        echo "<br>{$year}年{$month}月<br><br>";
        for($d=1;$d<=$lastday;$d++){
          $w=date("w",mktime(0,0,0,$month,$d,$year));
          $youbi=$wkanji[$w];
          $dd=$d."日(".$youbi.")";
          if($w==0) $dd="<span style='color:red'>{$dd}</span>";
          if($w==6) $dd="<span style='color:blue'>{$dd}</span>";
          echo "{$dd}<br>";
        }
      }
    ?>

</body>
</html>

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

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

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

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

<?php echo('hello!'); ?>
<?='hello'?>//上と動きは、同じです。echo短縮の書き方です。
<?php foreach($sample_arr as $sample_val) { ?>
<?=$sample_val?>
<?php } ?>
//上のコードは、下のようにも書くことが出来ます。
<?php foreach($sample_arr as $sample_val): ?>
<?=$sample_val?>
<?php endforeach; ?>

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/20 06:46 編集

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

    キャンセル

  • 2018/04/21 02:48

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

    キャンセル

checkベストアンサー

0

こんな感じですかね

<?php
$year=filter_input(INPUT_GET,'year')?:date('Y');
$month=filter_input(INPUT_GET,'month')?:date('n');
?>
<form method="get">
<select name="year">
<?php
for($i=2018;$i<=2020;$i++){
  $selected=$i==$year?" selected":"";
  print "<option value=\"{$i}\"{$selected}>{$i}</option>\n";
}
?>
</select>年
<select name="month">
<?php
for($i=1;$i<=12;$i++){
  $selected=$i==$month?" selected":"";
  print "<option value=\"{$i}\"{$selected}>{$i}</option>\n";
}
?>
</select>月
<input type="submit" value="表示">
</form>
<?php
$lastday=date('d',mktime(0,0,0,$month+1,0,$year));
$wkanji=["日","月","火","水","木","金","土"];
echo "<br>{$year}年{$month}月<br><br>";
for($d=1;$d<=$lastday;$d++){
  $w=date("w",mktime(0,0,0,$month,$d,$year));
  $youbi=$wkanji[$w];
  $dd=$d."日(".$youbi.")";
  if($w==0) $dd="<span style='color:red'>{$dd}</span>";
  if($w==6) $dd="<span style='color:blue'>{$dd}</span>";
  echo "{$dd}<br>";
}
?>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    PHPで電卓を作りたいのですが...

    今回初めてteratailを使用します。何かおかしなところがありましたら指摘してください。タイトルでも書きましたが、javascriptではなくphpで電卓を作りたいのです。そこで

  • 解決済

    縦型のカレンダーを出力したい PHP

    最終的には画像のように送信ボタンを押したら、選択年月が曜日と合わせて テーブルで出力されるカレンダーを作りたいのですが、 月初の曜日を月末まで連続して出力する処理の書き方がわか

  • 解決済

    PHP 非表示の状態からプルダウンメニューで選択し、 内容を表示させたい

    画像1 ⬇️  ⬇️  ⬇️  ⬇️ 画像2 画像1.画像2のように非表示の状態からプルダウンメニューで選択し、 javascriptは使用せず内容を表示させたいの

  • 解決済

    PHP 月別アーカイブを自動で

     実現したいこと 月別のアーカイブを自動で表示されるようにしたく 基本的なところは下記のページと同じなのですが https://teratail.com/questions/292

  • 解決済

    PHPでカレンダーを表示させたいのですが・・・

    PHPでカレンダーを表示したいのですが・・・。 表示形式は 1日(日) 2日(月) 3日(火) と続くようにしていきます。 これは実際にできました。これを使って、土曜日は青、日

  • 解決済

    生年月日をプルダウンに初期値登録

    データベースに登録されている生年月日を取り出してプルダウンの初期値としたいです。 データベースにはbirthという一つのカラムに登録されてて、プルダウンは年・月・日で分かれています

  • 受付中

    phpでドロップリスト作成

    phpで西暦を選択するドロップリストを作成しています. 非常に初歩的な質問で申し訳ないのですが,現在1990~2018の値が表示ドロップリストに表示されません. なぜでしょうか.

  • 解決済

    年月日をプルダウンメニューで選んで入力する(PHP)

    年月日をプルダウンメニューで選んで入力したいのですが、 下記のようにエラーが出ます。 該当箇所を見ても何が間違っているのかが理解できません。 どなたかお手数おかけしますが、ご回答頂

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

  • PHP

    20771questions

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