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

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

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

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

Q&A

解決済

1回答

545閲覧

カレンダー予約システムにて出力した文字列が上書きされないようにしたい。

shaketaku

総合スコア3

PHP

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

0グッド

0クリップ

投稿2022/05/30 04:40

初めまして、php、mysqlでカレンダー予約システムを作っているのですが、躓いてしまい質問させていただきました。

仕様としては

  • htmlで作成したformから情報を入力してもらう
  • その情報をphpでmysqlに登録する
  • 登録した内容をphpで取り出す
  • その内容をカレンダーに表示する

というものをイメージしております。

しかし、mysqlから取り出した内容をカレンダーに表示すると前回入力した文字列が新しい文字列に上書きされてしまいます。

つまり、1つしか予約が取れていない状態です。

これを何とかしたいです。

【実現したいこと】
データベースから情報を引き出し、カレンダーに表示した際に文字列が上書きされないようにしたい

【ソース】

calender.php

1<?php 2//googleカレンダーAPIから祝日を取得 3$year = date("Y"); 4 5function getHolidays($year){ 6 $api_key = "AIzaSyC5ADtyK9LwdI95ulCzKg8rHoxKe7Qb93g"; 7 $holidays = array(); 8 $holidays_id = 'japanese__ja@holiday.calendar.google.com'; 9 $url = sprintf( 10 'https://www.googleapis.com/calendar/v3/calendars/%s/events?'. 11 'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true', 12 $holidays_id, 13 $api_key, 14 $year. '-01-01T00:00:00Z', 15 $year. '-12-31T00:00:00Z', 16 150 17 ); 18 19 if($results = file_get_contents($url,true)){ 20 //file_get_contents関数を使用 21 //urlの中に情報が入っていれば以下を実行する 22 $results = json_decode($results); 23 //json形式で取得した情報を配列に格納 24 foreach($results ->items as $item){ 25 $date = strtotime((string)$item->start->date); 26 $title = (string)$item->summary; 27 $holidays[date('Y-m-d',$date)] = $title; 28 //年月日をキー、祝日名を配列に格納 29 } 30 ksort($holidays); 31 //祝日の配列を並び替え 32 //ksort関数で配列をキーで逆順に(1月からの順番にした) 33 } 34 return $holidays; 35} 36 37$Holidays_array = getHolidays($year); 38//getholidays関数を$holidays_arrayに代入して使用しやすいようにしておく 39//その日の祝日名を取得 40function display_to_Holidays($date,$Holidays_array){ 41//引数1は日付y-m-d型、引数には祝日の配列データ 42//display_to_Holidays("Y-m-d,Y-m-d) 43if(array_key_exists($date,$Holidays_array)){ 44 //array_key_exists関数を使用 45 //$dateが$Holidays_arrayに存在するか確認 46 //各日付と祝日の配列データを照らし合わせる 47 48 $holidays = "<br/>".$Holidays_array[$date]; 49 //祝日が見つかれば$holidaysに入れておく 50 return $holidays; 51} 52//その日の祝日名を取得 53} 54 55if(isset($_POST['name'])) { 56 //名前が送信されたら以下の処理を行う 57 //この部分は変更してもいい 58 59 //「予約フォーム」からの情報をそれぞれ変数に格納しておく↓ 60 61$id=htmlspecialchars($_POST["id"], ENT_QUOTES); 62$name=htmlspecialchars($_POST["name"], ENT_QUOTES); 63$using_time=htmlspecialchars($_POST["using_time"], ENT_QUOTES); 64$day=htmlspecialchars($_POST["day"], ENT_QUOTES); 65 66 //「予約フォーム」からの情報をそれぞれ変数に格納しておく↑ 67 68 69$dsn="mysql:host=localhost;dbname=reservation;charset=utf8"; 70$user="root"; 71$pass="growry1293"; 72 73 74try{ 75 $db = new PDO($dsn,$user,$pass); 76 $db->query("INSERT INTO reserve (ban,id,name,using_time,day) 77 VALUES (NULL,'$id','$name','$using_time','$day')"); 78 }catch (Exception $e) 79 { 80 echo $e->getMessage() . PHP_EOL; 81 } 82 83 header("Location: reservation_calender.php"); 84 //"reservation_form.php(予約フォームがあったページ)"に戻る 85 exit; 86} 87 function getreservation(){ 88 89 $dsn="mysql:host=localhost;dbname=reservation;charset=utf8"; 90 $user="root"; 91 $pass="growry1293"; 92 $db = new PDO($dsn,$user,$pass); 93 $ps = $db->query("SELECT * FROM reserve"); 94 $reservation_time = array(); 95 96 foreach($ps as $out){ 97 98 $day_out = strtotime((string) $out['day']); 99 100 $time_out = (string) $out['using_time']; 101 102 $reservation_time[date('Y-m-d', $day_out)] = $time_out; 103 104 } 105 ksort($reservation_time); 106 return $reservation_time; 107 } 108 109 function get_name(){ 110 111 $dsn="mysql:host=localhost;dbname=reservation;charset=utf8"; 112 $user="root"; 113 $pass="growry1293"; 114 $db = new PDO($dsn,$user,$pass); 115 $ps = $db->query("SELECT * FROM reserve"); 116 $name_reserve = array(); 117 118 foreach($ps as $out){ 119 120 $day_out = strtotime((string) $out['day']); 121 122 $name_out = (string) $out['name']; 123 124 $name_reserve[date('Y-m-d', $day_out)] = $name_out; 125 126 } 127 ksort($name_reserve); 128 return $name_reserve; 129 } 130 $reservation_array = getreservation(); 131//getreservation関数を$reservation_arrayに代入しておく 132 $name_array = get_name(); 133 134function reservation($date,$reservation_array,$name_array){ 135 //カレンダーの日付と予約された日付を照合する関数 136 137 if(array_key_exists($date,$reservation_array)){ 138 //もし"カレンダーの日付"と"予約された日"が一致すれば以下を実行する 139 if(array_key_exists($date,$name_array)){ 140 //もしカレンダーの日付と"人の名前"が一致すれば以下を実行する 141 } 142 if($reservation_array[$date] >= 4){ 143 //予約人数が4人以上の場合は以下を実行する 144 145 $reservation_member = "<br/>"."<span class='green'>"."予約できません"."</span>"; 146 return $reservation_member; 147 148 }else{ 149 //予約人数が4人より少なければ以下を実行する 150 151 $reservation_member = "<br/>"."<span class='green'>".$reservation_array[$date]."から".$name_array[$date]."</span>"; 152 //例:echo $reservation_member; → 3人 153 //色を変えるためにspanでclassをつけた 154 155 return $reservation_member; 156 157 } 158 } 159} 160//タイムゾーンを設定 161date_default_timezone_set('Asia/Tokyo'); 162 163//前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 164if(isset($_GET['ym'])){ 165 $ym = $_GET['ym']; 166}else{ 167 //今月の年月を表示 168 $ym = date('Y-m'); 169} 170 171//タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする 172//strtotime('Y-m-01') 173$timestamp = strtotime($ym . '-01'); 174if($timestamp === false){//エラー対策として形式チェックを追加 175 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 176 $ym = date('Y-m'); 177 $timestamp = strtotime($ym . '-01'); 178} 179 180//今月の日付 フォーマット 例)2020-10-2 181$today = date('Y-m-j'); 182 183//カレンダーのタイトルを作成 例)2020年10月 184$html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) 185 186//前月・次月の年月を取得 187//strtotime(,基準) 188$prev = date('Y-m', strtotime('-1 month', $timestamp)); 189$next = date('Y-m', strtotime('+1 month', $timestamp)); 190 191//該当月の日数を取得 192$day_count = date('t', $timestamp); 193 194//1日が何曜日か 195$datalist = date('w', $timestamp); 196 197//カレンダー作成の準備 198$weeks = []; 199$week = ''; 200 201//第1週目:空のセルを追加 202//str_repeat(文字列, 反復回数) 203$week .= str_repeat('<td></td>', $datalist); 204 205for($day = 1; $day <= $day_count; $day++, $datalist++){ 206 207 $date = $ym . '-' . $day; //2020-00-00 208 209 $Holidays_day = display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array); 210 //display_to_Holidays($date,$Holidays_array)の$dateに1/1~12/31の日付を入れる 211 212 $reservation = reservation(date("Y-m-d",strtotime($date)),$reservation_array,$name_array); 213 214 if($today == $date){ 215 $week .= '<td id="today">' . $day;//今日の場合はclassにtodayをつける 216 }elseif(display_to_Holidays(date("Y-m-d", strtotime($date)),$Holidays_array)){ 217 //もしその日に祝日が存在していたら 218 //その日が祝日の場合は祝日名を追加しclassにholidayを追加する 219 $week .= '<td class="holiday">' . $day . $Holidays_day; 220 }elseif(reservation(date("Y-m-d",strtotime($date)),$reservation_array,$name_array)){ 221 $week .= '<td>' . $day . $reservation; 222 }else{ 223 $week .= '<td>' . $day; 224 } 225 $week .= '</td>'; 226 227 if($datalist % 7 == 6 || $day == $day_count){//週終わり、月終わりの場合 228 //%は余りを求める、||はまたは 229 //土曜日を取得 230 231 if($day == $day_count){//月の最終日、空セルを追加 232 $week .= str_repeat('<td></td>', 6 - ($datalist % 7)); 233 } 234 235 $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 236 237 $week = '';//weekをリセット 238 } 239} 240?> 241 242 243 244<!DOCTYPE html> 245<html lang="ja"> 246<head> 247 <meta charset="UTF-8"> 248 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 249 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 250 <title>ESS reservation</title> 251 <link rel="stylesheet" href="style.css"> 252 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> 253 <link rel="preconnect" href="https://fonts.googleapis.com"> 254 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 255 <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300&display=swap" rel="stylesheet"> 256 <style> 257 /*カレンダーのレイアウト*/ 258 a{ 259 color: black; 260 text-decoration: none; 261 } 262 h3{ 263 margin-bottom: 30px; 264 } 265 th{ 266 width: 50px; 267 height: 50px; 268 text-align: center; 269 } 270 td{ 271 width: 50px; 272 height: 50px; 273 font-size: 10px; 274 } 275 #today{ 276 background: yellow; 277 } 278 .holiday{ 279 color: red; 280 } 281 .green{ 282 color: green; 283 } 284 th:nth-of-type(1),td:nth-of-type(1){ 285 color: red; 286 } 287 th:nth-of-type(7),td:nth-of-type(7){ 288 color: blue; 289 } 290 #calender{ 291 width: 95%; 292 background-color: white; 293 height: 500px; 294 margin: 0 auto; 295 } 296 .site_title{ 297 font-size: 30px; 298 background-color: whitesmoke; 299 font-weight: bold; 300 text-align: center; 301 box-shadow: 3px 3px 6px -2px #555, 302 3px 3px 8px rgba(255,255,255,0.8) inset; 303 width: 75%; 304 margin: 30px auto; 305 } 306 </style> 307</head> 308<body> 309 <h1 class = "site_title">NETFLIX予約カレンダー</h1> 310 <section class = "wrapper" id = "calender"> 311 <h3><a href="?ym=<?php echo $prev; ?>">&lt;</a>&nbsp;&nbsp;<?php echo $html_title; ?>&nbsp;&nbsp;<a href="?ym =<?php echo $next;?>">&gt;</a></h3> 312 <table class = "table table-bordered"> 313 <tr> 314 <th>日</th> 315 <th>月</th> 316 <th>火</th> 317 <th>水</th> 318 <th>木</th> 319 <th>金</th> 320 <th>土</th> 321 </tr> 322 <?php 323 foreach ($weeks as $week){ 324 echo $week; 325 } 326 ?> 327 </table> 328 </section> 329 </body>

色々と調べてみたのですが、おそらくカレンダーに出力する際のプログラムが間違っているのかと考えております。ただ、どのようにすれば上書きされずに済むのかが分からず困っております。

【現在の出力結果】
イメージ説明

イメージ説明

ここでaiueoとkakikukekoの2つを31のマスに同時に表示させたいです。

色々と長くなってしまいましたが、よろしくお願いいたします。

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

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

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

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

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

hoshi-takanori

2022/05/30 06:22

関数 getreservation や get_name の中で、同じ日付 (例えば 2022/5/31) に対して予約があると、 まず 15:33:00 の aiueo さんに対して、 ・$reservation_time['2022-5-31'] = '15:33:00'; ・$name_reserve[date('2022-5-31'] = 'aiueo'; 次に 17:35:00 の kakikukeko さんに対して、 ・$reservation_time['2022-5-31'] = '17:35:00'; ・$name_reserve[date('2022-5-31'] = 'kakikukeko'; となって上書きされてしまいます。 これを防ぐには、例えば ・$reservation_time['2022-5-31'] = ['15:33:00', '17:35:00']; ・$name_reserve[date('2022-5-31'] = ['aiueo', 'kakikukeko']; のように、各要素をそれぞれ配列にするか、もっといいのは ・$reservation['2022-5-31'] = [   ['time' => '15:33:00', 'name' => 'aiueo'],   ['time' => '17:35:00', 'name' => 'kakikukeko'],  ]; みたいな連想配列にすることでしょうね。
guest

回答1

0

ベストアンサー

function getreservation()の、
$reservation_time[date('Y-m-d', $day_out)] = $time_out;で、
同じ日付のデータがあると上書きしてしまっているのが原因でしょうね。
同様に、
function get_name()の、
$name_reserve[date('Y-m-d', $day_out)] = $name_out;
上書きしてしまっています。

で、じゃぁどうするか。
一つの方法は、

php

1if (array_key_exists(date('Y-m-d', $day_out), $reservation_time)) { 2 // すでにデータが詰められている 3 array_push($reservation_time[date('Y-m-d', $day_out)], $time_out); 4} 5else { 6 // まだデータは詰められていない 7 $reservation_time[date('Y-m-d', $day_out)] = [$time_out]; 8}

のようにすれば、日付をkeyにした配列でデータを持てるようになる。

投稿2022/05/30 06:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問