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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

5092閲覧

【カレンダー予約システム】クリックした日付を遷移ページ(予約画面)のinput type="date"に反映させたい

fk0617

総合スコア10

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/06/04 09:10

編集2020/06/09 09:56

前提・実現したいこと

phpの練習ででカレンダー予約システムを作成中です。
カレンダーの日付をクリックすると予約画面に遷移し、日付や時間、名前などをinput typeで入力できるようになっています。
その際にクリックした日付を遷移した画面(予約画面)のinput type="date"に反映させたいのですがどのようにコードを書けば良いのでしょうか?

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

エラーメッセージは表示されませんがカレンダーでクリックした日付の値を遷移ページのinput type="date"にセットするコードの書き方がわからないです。

該当のソースコード

php

1⚫️index.php 2 3<?php 4 5require_once('Calendar.php'); 6require_once('functions.php'); 7 8$cal = new \MyApp\Calendar(); 9 10 ?> 11 12<!DOCTYPE html> 13<html lang="ja"> 14<head> 15 <meta charset="utf-8"> 16 <title>schedule calendar</title> 17 <link rel="stylesheet" href="styles.css"> 18</head> 19<body> 20<h2>schedule</h2> 21<a href="weekly.php" id="week"></a> 22<a href="index.php" id="month"></a> 23<table border=1> 24 <thead> 25 <tr> 26 <th><a href="/?t=<?php echo h($cal->prev); ?>">&laquo;</a></th> 27 <th colspan="5"><?php echo h($cal->yearMonth); ?></th> 28 <th><a href="/?t=<?php echo h($cal->next); ?>">&raquo;</a></th> 29 </tr> 30 </thead> 31 <tbody> 32 <tr> 33 <td id="red">Sun</td> 34 <td>Mon</td> 35 <td>Tue</td> 36 <td>Wed</td> 37 <td>Thu</td> 38 <td>Fri</td> 39 <td id="blue">Sat</td> 40 </tr> 41 <form action="" method="POST" name="day"> 42 <?php echo $cal->show(); ?> 43 </form> 44</tbody> 45 <tfoot> 46 <tr> 47 <th colspan="7"><a href="/">Today</a></th> 48 </tr> 49 </tfoot> 50</table> 51</body> 52</html>

php

1⚫️Calendar.php 2 3<?php 4 5namespace MyApp; 6 7class Calendar { 8 public $prev; 9 public $next; 10 public $yearMonth; 11 private $_thisMonth; 12 public $html; 13 14 public function __construct() { 15 try { 16 if (!isset($_GET['t']) || !preg_match('/\A\d{4}-\d{2}\z/', $_GET['t'])) { 17 throw new \Exception(); 18 } 19 $this->_thisMonth = new \DateTime($_GET['t']); 20 } catch (\Exception $e) { 21 $this->_thisMonth = new \DateTime('first day of this month'); 22 } 23 $this->prev = $this->_createPrevLink(); 24 $this->next = $this->_createNextLink(); 25 $this->yearMonth = $this->_thisMonth->format('F Y'); 26 } 27 28 private function _createPrevLink() { 29 $dt = clone $this->_thisMonth; 30 return $dt->modify('-1 month')->format('Y-m'); 31 } 32 33 private function _createNextLink() { 34 $dt = clone $this->_thisMonth; 35 return $dt->modify('+1 month')->format('Y-m'); 36 } 37 38 public function show() { 39 $tail = $this->_getTail(); 40 $body = $this->_getBody(); 41 $head = $this->_getHead(); 42 $html = '<tr>' . $tail . $body . $head . '</tr>'; 43 echo $html; 44 } 45 46 private function _getTail() { 47 $tail = ''; 48 $lastDayOfPrevMonth = new \DateTime('last day of ' . $this->yearMonth . ' -1 month'); 49 while ($lastDayOfPrevMonth->format('w') < 6) { 50 $tail = sprintf('<td class="gray"><a href="reservation.php" onclick="form">%d</a></td>', $lastDayOfPrevMonth->format('d')) . $tail; 51 $lastDayOfPrevMonth->sub(new \DateInterval('P1D')); 52 } 53 return $tail; 54 } 55 56 private function _getBody() { 57 $body = ''; 58 $period = new \DatePeriod( 59 new \DateTime('first day of ' . $this->yearMonth), 60 new \DateInterval('P1D'), 61 new \DateTime('first day of ' . $this->yearMonth . ' +1 month') 62 ); 63 $today = new \DateTime('today'); 64 foreach ($period as $day) { 65 if ($day->format('w') === '0') { $body .= '</tr><tr>'; } 66 $todayClass = ($day->format('Y-m-d') === $today->format('Y-m-d')) ? 'today' : ''; 67 $body .= sprintf('<td class="youbi_%d %s"><a href="reservation.php">%d</a></td>', $day->format('w'), 68 $todayClass, $day->format('d')); 69 } 70 return $body; 71 } 72 73 private function _getHead() { 74 $head = ''; 75 $firstDayOfNextMonth = new \DateTime('first day of ' . $this->yearMonth . ' +1 month'); 76 while ($firstDayOfNextMonth->format('w') > 0) { 77 $head .= sprintf('<td class="gray"><a href="reservation.php">%d</a></td>', $firstDayOfNextMonth->format('d')); 78 $firstDayOfNextMonth->add(new \DateInterval('P1D')); 79 } 80 return $head; 81 } 82 83} 84

php

1⚫️reservation.php 2 3<?php 4 5require_once('config.php'); 6require_once('functions.php'); 7 8 9 10session_start(); 11 12// $dbh = connectDb(); 13 14$error = array(); 15 16 if ($_SERVER["REQUEST_METHOD"] !== "POST") { 17 setToken(); 18 } else { 19 checkToken(); 20 21 if (isset($_POST['submit'])) { 22 23 if (empty($_POST['content'])) { 24 $error['content'] = "選択して下さい"; 25 } else { 26 $content = $_POST['content']; 27 } 28 29 if (empty($_POST['date'])) { 30 $error['date'] = "入力して下さい"; 31 } else { 32 $date = $_POST['date']; 33 } 34 35 if (empty($_POST['time'])) { 36 $error['time'] = "入力して下さい"; 37 } else { 38 $time = $_POST['time']; 39 } 40 41 if (empty($_POST['name'])) { 42 $error['name'] = "名前を入力して下さい"; 43 } else { 44 $name = $_POST['name']; 45 } 46 47 if (empty($_POST['phone'])) { 48 $error['phone'] = "電話番号を入力して下さい"; 49 } else { 50 $phone = $_POST['phone']; 51 } 52 53 if (empty($_POST['email'])) { 54 $error['email'] = "メールアドレスを入力して下さい"; 55 } else { 56 $email = $_POST['email']; 57 } 58 59 if (!empty($_POST['question'])) { 60 $question = $_POST['question']; 61 } 62 63 // if (!empty($_POST['date'])) { 64 // $date = $_POST['date']; 65 // } 66 67 if (empty($error)) { 68 69 $dbh = connectDb(); 70 71 $sql = "INSERT INTO reservations 72 (content, date, time, name, phone, email, question, created) 73 VALUES 74 (:content, :date, :time, :name, :phone, :email, :question, now())"; 75 $stmt = $dbh->prepare($sql); 76 $params = array( 77 ':content' => $content, 78 ':date' => $date, 79 ':time' => $time, 80 ':name' => $name, 81 ':phone' => $phone, 82 ':email' => $email, 83 ':question' => $question 84 ); 85 $stmt->execute($params); 86 echo "予約が完了しました"; 87 $dbh = null; 88 } else { 89 echo "エラーが発生しました"; 90 } 91 92 } 93 // header('Location: complete.php'); 94 // exit; 95 // var_dump($params); 96} 97 98$start_time = 8; 99$end_time = 20; 100 101?> 102<!DOCTYPE html> 103<html lang="ja"> 104<head> 105 <meta charset="utf-8"> 106 <title>schedule calendar</title> 107 <link rel="stylesheet" href="styles.css"> 108</head> 109<body> 110<h2>予約内容</h2> 111<form action="" method="POST"> 112 <table border="3" frame="box"> 113 <tr> 114 <th> 115 <label>予約の種類</label> 116 </th> 117 <td> 118 <div> 119 <select name="content" value="<?php echo h($content); ?>"> 120 <option disabled selected>選択して下さい</option> 121 <option>見学</option> 122 <option>打ち合わせ</option> 123 <option>その他</option> 124 </select> 125 </div> 126 </td><br> 127 </tr> 128 <tr> 129 <th> 130 <div> 131 <label>日時</label> 132 </th> 133 <td> 134 135 <!-- ↓ここにクリックしたカレンダーの日付をセットしたい --> 136 <input type="date" name="date" value="<?php if (!empty($_POST['cal->show()'])) { 137 echo $_POST['cal->show()']; } ?>"><br> 138 139 <?php echo "<select name=\"time\" value=”<?php echo h($time); ?>”>"; 140 echo "<option disabeled selected>", 時間を選択して下さい, "</option>"; 141 for ($i = $start_time * 2; $i <= $end_time * 2; $i++) { 142 echo '<option>'.date("H:i", strtotime("00:00 +". $i * 30 ." minute")), '</option>'; 143 } 144 echo "</select>"; ?> 145 </td> 146 </div> 147 <br> 148 </td> 149 </tr> 150 <tr> 151 <td colspan="2"> 152 <p>*回答必須</p> 153 <div> 154 <label><span>*</span>名前</label> 155 <input type="text" name="name" value="<?php echo h($name); ?>"><br> 156 <?php if (!empty($error['name'])) { echo h($error['name']); } ?> 157 </div> 158 <div> 159 <label><span>*</span>電話番号</label> 160 <input type="text" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}" name="phone" value="<?php echo h($phone); ?>"> 161 <?php if (!empty($error['phone'])) { echo h($error['phone']); } ?> 162 </div> 163 <div> 164 <label><span>*</span>メールアドレス</label> 165 <input type="email" name="email" value="<?php echo h($email); ?>"> 166 <?php if (!empty($error['email'])) { echo h($error['email']); } ?> 167 <div> 168 </td> 169 </tr> 170 <tr> 171 <td colspan="2"> 172 <label>ご質問・ご要望は下記にご入力ください</label><br> 173 <textarea name="question" value="<?php echo h($question); ?>" rows="5" cols="50"></textarea><br> 174 </td> 175 </tr> 176 <tr> 177 <td colspan="2"> 178 <input type="submit" name="submit" class="btn" value="予約する"> 179 <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>"> 180 <input type="button" class="cancel_btn" value="戻る" onclick="history.back(-1)"> 181 </td> 182 </tr> 183 </table> 184</form> 185</body> 186</html> 187 188

試したこと

value=に”2020-06-04”などの値を入れると遷移した画面に反映するのでvalueにフォームでで渡ってきた$_POST['cal->show()']を書いてみましたがうまくいきません。
その他にjavascriptのquerySelectorで値が帰って来るのを期待しましたがダメでした。

補足情報(FW/ツールのバージョンなど)

PHP 7.1.33

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

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

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

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

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

m.ts10806

2020/06/04 09:51

> $_POST['cal-show()'] これ、何が入ってるつもりでしょうか。連想配列のキー参照で変数使うやり方も間違っているし、Calendarクラスのshowメソッドだとしても返す情報と整合性がとれてません。$_POSTをなんのために使ったのかも含めて、説明していただけますか? なにかもっと根本的なところから理解しないとこの先どうにもならなくなると思います
m.ts10806

2020/06/04 09:52

「うまくいかない」ではなにも伝わらないので起きた現象を具体的に記載してください
fk0617

2020/06/09 09:57

ご指摘ありがとうございます。 連想配列のキー参照の表記<が抜けてました。 また、showメソッドの返す日付を返す目的で書きましたが仰る通り相応しくないと理解しました。 $_POSTはカレンダーの日付を取得する為に使用しました。 起きている現象としてはindex.phpのformから送られて来ると期待した値がinput type="date"に入らずvalueに任意の日付を入力すれば反映はされます。 また、検索や予約システムのデモサイトのコードを参考にしましたが理解できませんでした…。 ご面倒おかけしてすみません。 宜しくお願いします。
guest

回答1

0

ベストアンサー

index.phpからreservation.phpに遷移するのに<a>タグが使われているためPOSTではなくGETになります。フォームからの送信ではないため$_POSTは空っぽになります。
Calender.phpの_getBody()を編集して"reservation.php?date=***"のようにパラメータ付きのGETリクエストで日付つきのURLに遷移するようにして、$_GET['date']のように取得するのが良いと思います。

php

1$body .= sprintf('<td class="youbi_%d %s"><a href="reservation.php?date=%s">%d</a></td>', $day->format('w'), 2$todayClass, $day->format('Y-m-d'), $day->format('d'));

投稿2020/06/10 12:42

reosablo

総合スコア339

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

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

reosablo

2020/06/10 12:46

補足ですが、reservation.phpの中身を`<? php phpinfo() ?>`に置き換えるとどんなデータが`$_POST`や`$_GET`に送られたかを簡単に確認することができます。送信したはずのデータが受け取れない場合にお試しください。
fk0617

2020/06/11 00:36

回答ありがとうございます。 教えて頂いた内容でコードを直したところ期待した動作をしました。 パラメーター付きで遷移する方法、phpinfoに関しても恥ずかしながら初めて知った内容でした。これからもっと学んでいきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問