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

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

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

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

Q&A

解決済

2回答

2675閲覧

カレンダーの日にちをリンクにしたい

kotouharuto

総合スコア38

PHP

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

1グッド

1クリップ

投稿2020/09/01 06:29

編集2020/09/01 21:33

実現したいこと

PHPで出力したカレンダーの日にちをリンクにして、その日にちをタッチしたらmenupost.phpに行けるようにしたいです。

現状

現在webサービスを開発しています。カレンダーの日にちを押したら別ファイルの予定入力ページに飛ぶようなプログラムを作りたいと思ったのですが、上手く変数の出力をリンクにすることができなっかったので質問させていただきました。

該当のソースコード

php

1// ccalendar.php 2<?php 3require_once '../libs/init.php'; 4// タイムゾーンを設定 5date_default_timezone_set('Asia/Tokyo'); 6 7// 前月・次月リンクが押された場合は、GETパラメーターから年月を取得 8if (isset($_GET['ym'])) { 9 $ym = $_GET['ym']; 10} else { 11 // 今月の年月を表示 12 $ym = date('Y-m'); 13} 14 15if (isset($_GET['ymd'])) { 16 $ymd = $_GET['ymd']; 17} 18 19// タイムスタンプを作成し、フォーマットをチェックする 20$timestamp = strtotime($ym . '-01'); 21if ($timestamp === false) { 22 $ym = date('Y-m'); 23 $timestamp = strtotime($ym . '-01'); 24} 25 26// 今日の日付 フォーマット 例)2018-07-3 27$today = date('Y-m-j'); 28 29// カレンダーのタイトルを作成 例)2017年7月 30$html_title = date('Y年n月', $timestamp); 31 32// 前月・次月の年月を取得 33// 方法1:mktimeを使う mktime(hour,minute,second,month,day,year) 34$prev = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)-1, 1, date('Y', $timestamp))); 35$next = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)+1, 1, date('Y', $timestamp))); 36 37// 方法2:strtotimeを使う 38// $prev = date('Y-m', strtotime('-1 month', $timestamp)); 39// $next = date('Y-m', strtotime('+1 month', $timestamp)); 40 41// 該当月の日数を取得 42$day_count = date('t', $timestamp); 43 44// 1日が何曜日か 0:日 1:月 2:火 ... 6:土 45// 方法1:mktimeを使う 46$youbi = date('w', mktime(0, 0, 0, date('m', $timestamp), 1, date('Y', $timestamp))); 47// 方法2 48// $youbi = date('w', $timestamp); 49 50 51// カレンダー作成の準備 52$weeks = []; 53$week = ''; 54 55// 第1週目:空のセルを追加 56// 例)1日が水曜日だった場合、日曜日から火曜日の3つ分の空セルを追加する 57$week .= str_repeat('<td></td>', $youbi); 58 59for ( $day = 1; $day <= $day_count; $day++, $youbi++) { 60 $date = $ym . '-' . $day; 61 62 if ($today == $date) { 63 // 今日の日付の場合は、class="today"をつける 64 $week .= '<td class="today">' . $day; 65 } else { 66 $week .= '<td>' . $day; 67 } 68 $week .= '</td>'; 69 70 // 週終わり、または、月終わりの場合 71 if ($youbi % 7 == 6 || $day == $day_count) { 72 73 if ($day == $day_count) { 74 // 月の最終日の場合、空セルを追加 75 // 例)最終日が木曜日の場合、金・土曜日の空セルを追加 76 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); 77 } 78 79 // weeks配列にtrと$weekを追加する 80 $weeks[] = '<tr>' . $week . '</tr>'; 81 82 // weekをリセット 83 $week = ''; 84 } 85} 86?> 87<!DOCTYPE html> 88<html lang="ja"> 89<head> 90 <meta charset="utf-8"> 91 <title>PHPカレンダー</title> 92 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 93 <link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP" rel="stylesheet"> 94 <style> 95 .container { 96 font-family: 'Noto Sans JP', sans-serif; 97 margin-top: 80px; 98 } 99 h3 { 100 margin-bottom: 30px; 101 } 102 th { 103 height: 30px; 104 text-align: center; 105 } 106 td { 107 height: 100px; 108 } 109 .today { 110 background: orange; 111 } 112 th:nth-of-type(1), td:nth-of-type(1) { 113 color: red; 114 } 115 th:nth-of-type(7), td:nth-of-type(7) { 116 color: blue; 117 } 118 </style> 119</head> 120<body> 121 <div class="container"> 122 <h3><a href="?ym=<?php echo $prev; ?>">&lt;</a> <?php echo $html_title; ?> <a href="?ym=<?php echo $next; ?>">&gt;</a></h3> 123 <table class="table table-bordered"> 124 <tr> 125 <th></th> 126 <th></th> 127 <th></th> 128 <th></th> 129 <th></th> 130 <th></th> 131 <th></th> 132 </tr> 133 <?php 134 foreach ($weeks as $week) { 135 // ここで$weekのデータをリンクにして表示しようとしています。 136 echo "<a href='menupost.php?ymd={$date}'>".$week."</a>"; 137 } 138 ?> 139 </table> 140 </div> 141</body> 142</html>

試したこと

  • echo ‘<a href=“?ymd=<?php echo $week ?>“>‘.$week.‘</a>’

こうしましたが “> と表示されてそれがリンクになってしまいます。

  • echo "<a href='menupost.php?ymd={$date}'>".$week."</a>";

こちらの方法だとリンクではなく普通に日にちが表示されてしまいます。

補足情報

m6usさんのご回答を取り入れた結果がこちらです。
イメージ説明

日にちが表示されなくなり、曜日の上に31というリンクが5個出てきます。


以上です。
ご回答よろしくお願いします。
また、ご不明な点があれば教えてください。

andoe1515👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

php

1 if ($today == $date) { 2 // 今日の日付の場合は、class="today"をつける 3 $week .= '<td class="today">' . $day; 4 } else { 5 $week .= '<td>' . $day; 6 } 7 $week .= '</td>';

ここで日付のセルに相当するHTMLを生成しているのでしょうから、
$dayを挟むようにA要素を配置すればリンクになるのでは?

こういう設計でいいかは質問者さん自身に検証してもらうとして、例えば

php

1 $link = '<a href="menupost.php?date="' . $date . '>' . $day . '</a>' 2 if ($today == $date) { 3 // 今日の日付の場合は、class="today"をつける 4 $week .= '<td class="today">' . $link . '</td>';; 5 } else { 6 $week .= '<td>' . $link . '</td>';; 7 }

みたいに書けば、日付情報をGETでphp処理に渡せるのではないかと。
受け取るphpの処理で$_GET['date']などとして参照できます。

投稿2020/09/01 07:03

編集2020/09/02 00:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kotouharuto

2020/09/01 21:30

ご回答ありがとうございます。 ご回答いただいた通りこのようにしたのですが、 echo "<a href='menupost.php'>".$day."</a>"; 日にちが表示されなくなり、その代わり曜日の上に5つ「31」というリンクが出てきてしまいます。 表現力がなくて申し訳ないです。 補足情報として画像を貼っておきます。
退会済みユーザー

退会済みユーザー

2020/09/02 00:57 編集

tdで囲っていないのでは? 表敬式で見せるためには、table>tr>tdと囲むのは外せません。 tdの中で単に日付を文字表示するのではなく、その日付表示文字にa要素を付けて装飾します。 webブラウザ上でHTMLソースをチェックする癖をつけてください。
kotouharuto

2020/09/02 08:00

あ、確かにそうでした。 試してみます、ありがとうございます。
guest

0

PHP度外視でHTMLを正しく組むところから始めてください。
Webアプリケーションなのであれば、HTMLを正しく組む力は必須です。
「モック」と言います。
「試作品」という意味ですが、組みあがったHTMLがそのままPHPで出力する際のイメージになり、モック通りに出力できるかチェックする機能も果たします。
レイアウトが違っていればモック通りに出力できていないということになります。

例えば下記のようなHTMLをモックとして組めば

html

1<table> 2 <tr> 3 <td>1</td> 4 <td>2</td> 5 </tr> 6 <tr> 7 <td>3</td> 8 <td>4</td> 9 </tr> 10 <tr> 11 <td>5</td> 12 <td>6</td> 13 </tr> 14</table>

PHPで出力する際に「不変なところはどこか」「可変なところはどこか」「繰り返しはどこか」がイメージして組むことができます

投稿2020/09/01 23:56

編集2020/09/02 01:18
m.ts10806

総合スコア80765

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

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

m.ts10806

2020/09/02 01:18

無言低評価反対。
kotouharuto

2020/09/02 07:59

ご回答ありがとうございます。 低評価を押したのは僕じゃないです。 そんな方法があるんですね、参考にさせていただきます。
m.ts10806

2020/09/02 09:44

質問者さんでないことは分かってますし、犯人探しをしたいわけではないです。 低評価も発言に対する指摘だと思っていますが、回答への低評価は理由選択がなく、コメント投稿するよう促されるのですが、それを蹴ってまで遂行したということはそらなりに後ろめたい理由なんだろうなと。 質問内容を見ればちゃんとHTML組めてないのは明らかなので、外れている回答ではないと思います。ふざけた回答もしていません。 であれば、どういう理由で低評価したのかコメントされないと改善できない。議論しないことには良い方向にはいかない。 ということで、あくまで内容ではなく私個人へ何か後ろ向きな感情がある人なんだろうなと、言い方悪いけど個人攻撃だと捉えました。
kotouharuto

2020/09/05 01:31

返信が遅れて申し訳ないです。 ありがとうございます。 そうですよね、その考えには賛成です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問