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

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

ただいまの
回答率

90.35%

  • PHP

    21253questions

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

  • MySQL

    6138questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

DBから取得した予定を組み込んだカレンダー作成

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,832

tomuumi

score 1

前提・実現したいこと

PHPでカレンダーを作成しています。ただ日付を表示するところまではできたのですが、データベースから取得したスケジュールを表示させる方法がわかりません。
予定がない火は日付だけを、予定がある日は日付のしたに予定名を表示させたカレンダーを作りたいです。
ページ遷移(次の月など)はまだ手をつけてないので、ひと月分の表示だけで大丈夫です。
初心者のため、質問の文がわかりづらいかもしれませんが、どうかご協力よろしくお願いいたします。

発生している問題・エラーメッセージ

下記のコードだと、予定を取得するためにまわしたforの数だけ他の日にちも増えてしまいます。<td>タグの置く場所が問題なのはわかるのですが、どう書けばよいのか思いつきません。
データベースから取得したものを格納した配列は、
Array ( 
[0] => Array ( [schedule_id] => 1 [schedule_name] => スケジュール1 [schedule_date] => 2017-02-23 ) 
[1] => Array ( [schedule_id] => 2 [schedule_name] => スケジュール2 [schedule_date] => 2017-02-25 ) 

という感じです。

該当のソースコード

//データベースから予定を取得
$schedule_list = array();
while ($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
  $schedule_list[] = $row;
}

//日付データを変数に格納
$year = 2017; //(仮)
$month = 02;  //(仮)
$ym = $year."-".$month;
$youbi_list = array("日","月","火","水","木","金","土");
$last_date = date("t", mktime(0, 0, 0, $month, 01, $year));
$timestampfirst = mktime(0, 0, 0, $month, 01, $year);
$first_youbi = date("w", $timestampfirst);
$timestamplast = mktime(0, 0, 0, $month , $last_date, $year);
$last_youbi = date("w", $timestamplast);

//テーブル作成
print("<table class=\"calendar\" border=\"1\" cellpadding=\"1\" cellspacing=\"0\" align=\"center\">");
print("<tr>");

//曜日部分
for ($i = 0; $i < 7; $i++) {
  print("<th width=\"100\" height=\"30\" style=\"font-size : 22px;\">".$youbi_list[$i]."</th>");
}
print("</tr>");

//1日より前の空白部分
for ($i = 1; $i <= $first_youbi; $i++) {
  print("<td height=\"60\">$nbsp</td>");
}

//日付部分
for ($j = 1; $j <= $last_date; $j++) {
  for ($k = 0; $k < count($schedule_list); $k++){
    if ($schedule_list[$k]["schedule_date"] == $ym."-".$j) {
      print("<td height=\"60\" valign=\"top\" style=\"font-size : 20px;\">".$j."<br />".$schedule_list[$k]["schedule_name"]."</td>");
    } else {
      print("<td height=\"60\" valign=\"top\" style=\"font-size : 20px;\">".$j."<br /></td>");
    }
  }

  //土曜日で次の行に
  if (($i + $j -1) % 7 == 0) {
    print("</tr>");
  }

}

//最終日以降の空白部分
for ($l = $last_youbi; $l < 6; $l++) {
  print("<td>$nbsp</td>");
}

print("</table>");
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2017/02/05 04:23

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

checkベストアンサー

+1

サンプル

頑張ってコードを読んでください。

<?php

function getScheduleFromDb($date)
{
//    テスト時サンプル
//    return [
//        '2017' => [
//            '01' => [
//                '15' => ['予定1', '予定2']
//            ]
//        ]
//    ];

    $dsn = 'mysql:host=localhost;dbname=schedule;charset=utf8';
    $username = 'root';
    $password = 'password';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ];
    $pdo = new PDO($dsn, $username, $password, $options);

    $year = (new DateTime($date))->format('Y');
    $month = (new DateTime($date))->format('m');

    $sql = 'SELECT ';
    $sql .= '`date`';
    $sql .= ', YEAR(`date`) as `y` ';
    $sql .= ', MONTH(`date`) as `m` ';
    $sql .= ', DAY(`date`) as `d` ';
    $sql .= ', `content` ';
    $sql .= 'FROM `schedule` ';
    $sql .= 'WHERE 1 ';
    $sql .= 'AND YEAR(`date`) = :year ';
    $sql .= 'AND MONTH(`date`) = :month ';

    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':year', $year);
    $stmt->bindValue(':month', $month);
    $stmt->execute();
    $rows = $stmt->fetchAll();

    $res = [];
    foreach ($rows as $row) {
        $res[$row['y']][$row['m']][$row['d']][] = $row['content'];
    }
    return $res;
}

/**
 * function.calendar.php
 */
function calendar($year, $month)
{
    // スケジュール取得
    $today = new \DateTime();
    $schedule = getScheduleFromDb($today);

    // カレンダー作成
    $objDate = new \DateTime();
    $objDate->setDate($year, $month, 1);
    $weekday = $objDate->format('w');
    $objDate->sub(new \DateInterval(sprintf('P%dD', $weekday)));
    $objEnd = new \DateTime();
    $objEnd->setDate($year, $month, 1);
    $objEnd->add(new DateInterval('P1M'));
    $wd = $objEnd->format('w');
    $objEnd->add(new DateInterval(sprintf('P%dD', fmod((6 - $wd), 6))));

    $h = [];
    $h[] = '<table class="php-calendar table table-bordered">';
    $h[] = '<thead>';
    $h[] = '<tr>';
    $h[] = '<th class="text-center">';
    $h[] = '<a href="">';
    $h[] = '<i class="fa fa-chevron-left"></i>';
    $h[] = '</a>';
    $h[] = '</th>';
    $h[] = '<th class="text-center" colspan="5">';
    $h[] = '</th>';
    $h[] = '<th class="text-center">';
    $h[] = '<a href="">';
    $h[] = '<i class="fa fa-chevron-right"></i>';
    $h[] = '</a>';
    $h[] = '</th>';
    $h[] = '</tr>';
    $h[] = '<tr>';
    $arrWeek = [
        '日'
        , '月'
        , '火'
        , '水'
        , '木'
        , '金'
        , '土'
    ];
    foreach ($arrWeek as $w) {
        $h[] = sprintf('<th class="text-center">%s</th>', $w);
    }
    $h[] = '</tr>';
    $h[] = '</thead>';
    $h[] = '<tbody>';
    while ($objDate <= $objEnd) {
        if (0 == $objDate->format('w')) {
            $h[] = '<tr>';
            $class = [$objDate->format('D'), 'text-red'];
        } else if (6 == $objDate->format('w')) {
            $class = [$objDate->format('D'), 'text-blue'];
        } else {
            $class = [$objDate->format('D')];
        }

        $sch = (isset($schedule[$objDate->format('Y')][$objDate->format('m')][$objDate->format('d')]))
                ? $schedule[$objDate->format('Y')][$objDate->format('m')][$objDate->format('d')]
                : [];

        $h[] = sprintf('<td class="%s" data-date="%s"><span class="%s">%d</span><div>%s</div></td>'
            , ($today->format('Y-m-d') === $objDate->format('Y-m-d')) ? 'active' : ''
            , $objDate->format('Y-m-d')
            , implode(' ', $class)
            , $objDate->format('d')
            , implode('<br>', $sch)
        );
        if (6 == $objDate->format('w')) {
            $h[] = '</tr>';
        }
        $objDate->add(new \DateInterval('P1D'));
    }
    $h[] = '</tbody>';
    $h[] = '</table>';
    return implode(PHP_EOL, $h);
}

echo calendar(2017, 1);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    21253questions

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

  • MySQL

    6138questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。