🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

977閲覧

カレンダーの前月を表示させたいが、データベースの一覧が表示される。

minma

総合スコア2

PHP

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

0グッド

0クリップ

投稿2021/02/15 08:52

前提・実現したいこと

カレンダーを作っています。
しかし、前月や次の月のボタン(カレンダーの上の方の矢印)を押したら、前月分のカレンダーを表示させたいのですが、データベースの一覧が出てきます。

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

出てきません。

該当のソースコード

<?php function h($s) { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); } try { if (!isset($_GET['t']) || !preg_match('/\A\d{4}-\d{2}\z/', $_GET['t'])) { throw new Exception(); } $thisMonth = new DateTime($_GET['t']); } catch (Exception $e) { $thisMonth = new DateTime('first day of this month'); } $dt = clone $thisMonth; $prev = $dt->modify('-1 month')->format('Y-m'); $dt = clone $thisMonth; $next = $dt->modify('+1 month')->format('Y-m'); $yearMonth = $thisMonth->format('F Y'); $tail = ''; $lastDayOfPrevMonth = new DateTime('last day of' . $yearMonth . ' -1 month'); while ($lastDayOfPrevMonth->format('w') < 6) { $tail = sprintf('<td class="gray">%d</td>', $lastDayOfPrevMonth->format('d')) . $tail; $lastDayOfPrevMonth->sub(new DateInterval('P1D')); } $body = ''; $period = new DatePeriod( new DateTime('first day of' . $yearMonth), new DateInterval('P1D'), new DateTime('first day of' . $yearMonth . ' +1 month') ); $today = new DateTime('today'); foreach ($period as $day) { if ($day->format('w') % 7 === 0) { $body .= '</tr><tr>'; } $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; $body .= sprintf('<td class="youbi_%d %s">%d</td>', $day->format('w'), $todayClass, $day->format('d')); } $head = ''; $firstDayOfNextMonth = new DateTime('first day of' . $yearMonth . ' +1 month'); while ($firstDayOfNextMonth->format('w') > 0) { $head .= sprintf('<td class="gray">%d</td>', $firstDayOfNextMonth->format('d')); $firstDayOfNextMonth->add(new DateInterval('P1D')); } $html = '<tr>' . $tail . $body . $head . '</tr>'; ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="css/style.css"> <title>Calender</title> </head> <body> <table> <thead> <tr> <th><a href="/?t=<?php echo h($prev); ?>">&laquo;</a></th> <th colspan="5"><?php echo h($yearMonth); ?></th> <th><a href="/?t=<?php echo h($next); ?>">&raquo;</a></th> </tr> </thead> <tbody> <tr> <td>Sun</td> <td>Mon</td> <td>Tue</td> <td>Wed</td> <td>Thu</td> <td>Fri</td> <td>Sat</td> </tr> <?php echo $html; ?> </tbody> <tfoot> <tr> <th colspan="7"><a href="/">Today</a></th> </tr> </tfoot> </table> </body> </html>

また、できれば、こういった場合の対処を調べる検索のしかたも知りたいです。
よろしくお願いします。

イメージ説明

イメージ説明

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/02/15 08:56

先月や次月の表示を意図してクリックする箇所で右クリックして「リンク先URL」を取得したときにどうなっていますか?
m.ts10806

2021/02/15 09:44

データベースの一覧じゃなくてディレクトリの一覧。 実行したいPHPはどこに置いてますかね
minma

2021/02/16 01:50

MAMP/htdocs/calender/index.phpのindex.phpを実行したいです。
m.ts10806

2021/02/16 01:51

回答してます。
minma

2021/02/16 01:53

すみません、今見ました。やってみます。
guest

回答2

0

/で始めるとWebルートからのパスになります。
それはそれで良いとして、きちんとWebルートから実行したいPHPのパスを指定しましょう。

投稿2021/02/15 09:46

m.ts10806

総合スコア80875

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

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

minma

2021/02/16 01:58

構造が理解できました。ありがとうございました!
m.ts10806

2021/02/16 02:07

認識は改めたほうがいいかもしれません。 「自身で定義した構造」です。 要件定義、設計はご自身のはずなので、本来は「どのようなURLでアクセスさせるのか」というところまで決めておきたいところ。 (おそらく、今回は相対パスと絶対パスの認識不足部分が原因ですが、「決めの弱さ」もあると思うので)
minma

2021/02/17 05:33

まだまだ勉強不足でした。 要件定義、設計などしっかりしていこうと思います。 ありがとうございました。
guest

0

ベストアンサー

php -S localhost:8080
などとしてビルドインサーバーを立ててリンク先の指定を修正した上で実行してみるとひとまず動くので、
リンク先の指定がそのままでいいのかな?ってところが気になります。

もしも、このphpコードを書いたファイル名が index.php であるなら、
リンク先を index.php?t=2021-03 などとすれば確実に同じphpコードの処理が呼び出されますが、
どうしても /?t=2021-03 でやりたいのであれば、webサーバーに細工を施す必要があります。

以下、apache httpdのwebサーバーである前提の説明ですが、
いわゆるドキュメントルートに index.php を置いて、
そこに「.htaccess」というファイルをつくり、その中に

DirectoryIndex index.php

などとすれば、対策できるかもしれません。

投稿2021/02/15 09:46

編集2021/02/15 09:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

minma

2021/02/16 01:59

リンク先を変えて、動きました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問