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

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

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

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

受付中

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

shaketaku
shaketaku

総合スコア0

PHP

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

1回答

0評価

0クリップ

165閲覧

投稿2022/05/30 04:40

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

仕様としては

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

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

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

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

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

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

【ソース】

calender.php

<?php //googleカレンダーAPIから祝日を取得 $year = date("Y"); function getHolidays($year){ $api_key = "AIzaSyC5ADtyK9LwdI95ulCzKg8rHoxKe7Qb93g"; $holidays = array(); $holidays_id = 'japanese__ja@holiday.calendar.google.com'; $url = sprintf( 'https://www.googleapis.com/calendar/v3/calendars/%s/events?'. 'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true', $holidays_id, $api_key, $year. '-01-01T00:00:00Z', $year. '-12-31T00:00:00Z', 150 ); if($results = file_get_contents($url,true)){ //file_get_contents関数を使用 //urlの中に情報が入っていれば以下を実行する $results = json_decode($results); //json形式で取得した情報を配列に格納 foreach($results ->items as $item){ $date = strtotime((string)$item->start->date); $title = (string)$item->summary; $holidays[date('Y-m-d',$date)] = $title; //年月日をキー、祝日名を配列に格納 } ksort($holidays); //祝日の配列を並び替え //ksort関数で配列をキーで逆順に(1月からの順番にした) } return $holidays; } $Holidays_array = getHolidays($year); //getholidays関数を$holidays_arrayに代入して使用しやすいようにしておく //その日の祝日名を取得 function display_to_Holidays($date,$Holidays_array){ //引数1は日付y-m-d型、引数には祝日の配列データ //display_to_Holidays("Y-m-d,Y-m-d) if(array_key_exists($date,$Holidays_array)){ //array_key_exists関数を使用 //$dateが$Holidays_arrayに存在するか確認 //各日付と祝日の配列データを照らし合わせる $holidays = "<br/>".$Holidays_array[$date]; //祝日が見つかれば$holidaysに入れておく return $holidays; } //その日の祝日名を取得 } if(isset($_POST['name'])) { //名前が送信されたら以下の処理を行う //この部分は変更してもいい //「予約フォーム」からの情報をそれぞれ変数に格納しておく↓ $id=htmlspecialchars($_POST["id"], ENT_QUOTES); $name=htmlspecialchars($_POST["name"], ENT_QUOTES); $using_time=htmlspecialchars($_POST["using_time"], ENT_QUOTES); $day=htmlspecialchars($_POST["day"], ENT_QUOTES); //「予約フォーム」からの情報をそれぞれ変数に格納しておく↑ $dsn="mysql:host=localhost;dbname=reservation;charset=utf8"; $user="root"; $pass="growry1293"; try{ $db = new PDO($dsn,$user,$pass); $db->query("INSERT INTO reserve (ban,id,name,using_time,day) VALUES (NULL,'$id','$name','$using_time','$day')"); }catch (Exception $e) { echo $e->getMessage() . PHP_EOL; } header("Location: reservation_calender.php"); //"reservation_form.php(予約フォームがあったページ)"に戻る exit; } function getreservation(){ $dsn="mysql:host=localhost;dbname=reservation;charset=utf8"; $user="root"; $pass="growry1293"; $db = new PDO($dsn,$user,$pass); $ps = $db->query("SELECT * FROM reserve"); $reservation_time = array(); foreach($ps as $out){ $day_out = strtotime((string) $out['day']); $time_out = (string) $out['using_time']; $reservation_time[date('Y-m-d', $day_out)] = $time_out; } ksort($reservation_time); return $reservation_time; } function get_name(){ $dsn="mysql:host=localhost;dbname=reservation;charset=utf8"; $user="root"; $pass="growry1293"; $db = new PDO($dsn,$user,$pass); $ps = $db->query("SELECT * FROM reserve"); $name_reserve = array(); foreach($ps as $out){ $day_out = strtotime((string) $out['day']); $name_out = (string) $out['name']; $name_reserve[date('Y-m-d', $day_out)] = $name_out; } ksort($name_reserve); return $name_reserve; } $reservation_array = getreservation(); //getreservation関数を$reservation_arrayに代入しておく $name_array = get_name(); function reservation($date,$reservation_array,$name_array){ //カレンダーの日付と予約された日付を照合する関数 if(array_key_exists($date,$reservation_array)){ //もし"カレンダーの日付"と"予約された日"が一致すれば以下を実行する if(array_key_exists($date,$name_array)){ //もしカレンダーの日付と"人の名前"が一致すれば以下を実行する } if($reservation_array[$date] >= 4){ //予約人数が4人以上の場合は以下を実行する $reservation_member = "<br/>"."<span class='green'>"."予約できません"."</span>"; return $reservation_member; }else{ //予約人数が4人より少なければ以下を実行する $reservation_member = "<br/>"."<span class='green'>".$reservation_array[$date]."から".$name_array[$date]."</span>"; //例:echo $reservation_member; → 3人 //色を変えるためにspanでclassをつけた return $reservation_member; } } } //タイムゾーンを設定 date_default_timezone_set('Asia/Tokyo'); //前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 if(isset($_GET['ym'])){ $ym = $_GET['ym']; }else{ //今月の年月を表示 $ym = date('Y-m'); } //タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする //strtotime('Y-m-01') $timestamp = strtotime($ym . '-01'); if($timestamp === false){//エラー対策として形式チェックを追加 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 $ym = date('Y-m'); $timestamp = strtotime($ym . '-01'); } //今月の日付 フォーマット 例)2020-10-2 $today = date('Y-m-j'); //カレンダーのタイトルを作成 例)2020年10月 $html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) //前月・次月の年月を取得 //strtotime(,基準) $prev = date('Y-m', strtotime('-1 month', $timestamp)); $next = date('Y-m', strtotime('+1 month', $timestamp)); //該当月の日数を取得 $day_count = date('t', $timestamp); //1日が何曜日か $datalist = date('w', $timestamp); //カレンダー作成の準備 $weeks = []; $week = ''; //第1週目:空のセルを追加 //str_repeat(文字列, 反復回数) $week .= str_repeat('<td></td>', $datalist); for($day = 1; $day <= $day_count; $day++, $datalist++){ $date = $ym . '-' . $day; //2020-00-00 $Holidays_day = display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array); //display_to_Holidays($date,$Holidays_array)の$dateに1/1~12/31の日付を入れる $reservation = reservation(date("Y-m-d",strtotime($date)),$reservation_array,$name_array); if($today == $date){ $week .= '<td id="today">' . $day;//今日の場合はclassにtodayをつける }elseif(display_to_Holidays(date("Y-m-d", strtotime($date)),$Holidays_array)){ //もしその日に祝日が存在していたら //その日が祝日の場合は祝日名を追加しclassにholidayを追加する $week .= '<td class="holiday">' . $day . $Holidays_day; }elseif(reservation(date("Y-m-d",strtotime($date)),$reservation_array,$name_array)){ $week .= '<td>' . $day . $reservation; }else{ $week .= '<td>' . $day; } $week .= '</td>'; if($datalist % 7 == 6 || $day == $day_count){//週終わり、月終わりの場合 //%は余りを求める、||はまたは //土曜日を取得 if($day == $day_count){//月の最終日、空セルを追加 $week .= str_repeat('<td></td>', 6 - ($datalist % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 $week = '';//weekをリセット } } ?> <!DOCTYPE html> <html lang="ja"> <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"> <title>ESS reservation</title> <link rel="stylesheet" href="style.css"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300&display=swap" rel="stylesheet"> <style> /*カレンダーのレイアウト*/ a{ color: black; text-decoration: none; } h3{ margin-bottom: 30px; } th{ width: 50px; height: 50px; text-align: center; } td{ width: 50px; height: 50px; font-size: 10px; } #today{ background: yellow; } .holiday{ color: red; } .green{ color: green; } th:nth-of-type(1),td:nth-of-type(1){ color: red; } th:nth-of-type(7),td:nth-of-type(7){ color: blue; } #calender{ width: 95%; background-color: white; height: 500px; margin: 0 auto; } .site_title{ font-size: 30px; background-color: whitesmoke; font-weight: bold; text-align: center; box-shadow: 3px 3px 6px -2px #555, 3px 3px 8px rgba(255,255,255,0.8) inset; width: 75%; margin: 30px auto; } </style> </head> <body> <h1 class = "site_title">NETFLIX予約カレンダー</h1> <section class = "wrapper" id = "calender"> <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> <table class = "table table-bordered"> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> <?php foreach ($weeks as $week){ echo $week; } ?> </table> </section> </body>

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

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

イメージ説明

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

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

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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'],  ]; みたいな連想配列にすることでしょうね。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

PHP

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